问题标签 [spinlock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
489 浏览

.net - .Net 框架中是否有使用自旋锁或自旋等待的示例?

我查看了并发集合,但它们似乎在引擎盖下使用了普通锁定。.Net 框架中有没有使用这种锁定结构的好例子?


我最初查看的是 ConcurrentDictionary。我看到它使用的是普通锁,但 BlockingCollection 类在其内部方法中使用了 SpinWait。

0 投票
1 回答
361 浏览

iphone - iOS线程问题

我通过 NSOparationInvokation 加载图像并在主线程中调用方法,该方法将此图像添加到滚动视图,但应用程序几乎没有滞后。如果我加载图像但不添加它视图,应用程序正常工作,如果我在视图应用程序上添加测试按钮也可以正常工作,如果我加载图像并添加测试按钮以查看应用程序不要滞后。通过 __spin_lock 中的探查器问题。有人知道怎么了?谢谢。

0 投票
2 回答
838 浏览

locking - 比 pthread 更快的锁

我们正在构建一个对延迟非常敏感的应用程序。我们的完整应用程序在一个进程中除了锁定之外大约需要 2500 个时钟周期,并且需要获取和释放两个锁。我们预计 99.98% 的时间不会发生争用。使用 pthread 锁定和解锁需要大约 1800 个额外的周期。更快的配方有什么指示吗?基于原子操作编写锁可能很棘手。如果可能,我们更喜欢使用 Linux 标头中的标准代码或提升标头。

0 投票
3 回答
4959 浏览

lock-free - 自旋锁总是需要内存屏障吗?在内存屏障上旋转是否昂贵?

我写了一些无锁代码,在大多数情况下都可以很好地处理本地读取。

本地旋转内存读取是否一定意味着我必须始终在旋转读取之前插入内存屏障?

(为了验证这一点,我设法生成了一个读写器组合,这导致在某些非常特定的条件下——专用 CPU、附加到 CPU 的进程、优化器一直打开、没有其他工作,读者永远看不到写入的值在循环中完成——所以箭头确实指向那个方向,但我不完全确定旋转通过内存屏障的成本。)

如果缓存的存储缓冲区中没有要刷新的内容,那么旋转通过内存屏障的成本是多少?即,所有过程正在做(在C中)是

我是否正确地假设它是免费的并且它不会用任何流量阻碍内存总线?

另一种说法是问:内存屏障除了刷新存储缓冲区、对其应用无效以及防止编译器在其位置重新排序读取/写入之外,还有什么作用吗?


反汇编, __sync_synchronize() 似乎转化为:

来自英特尔手册(对于新手来说同样模糊):

我的翻译:“当你说 LOCK 时,这会很昂贵,但我们只在必要时才这样做。”


@BlankXavier:

我确实测试过,如果写入器没有明确地从存储缓冲区中推出写入,并且它是该 CPU 上运行的唯一进程,那么读者可能永远看不到写入器的效果(我可以使用测试程序重现它,但是正如我上面提到的,它只发生在特定的测试中,具有特定的编译选项和专用的核心分配——我的算法工作正常,只有当我对它的工作原理感到好奇并编写了我意识到它可能具有的显式测试时一个问题在路上)。

我认为默认情况下简单的写入是 WB 写入(回写),这意味着它们不会立即被刷新,但读取将采用它们的最新值(我认为他们称之为“存储转发”)。所以我为作者使用了 CAS 指令。我在 Intel 手册中发现了所有这些不同类型的写入实现(UC、WC、WT、WB、WP),Intel vol 3A 第 11-10 章,仍在学习它们。

我的不确定性在于读者方面:我从 McKenney 的论文中了解到,还有一个失效队列,一个从总线到缓存的传入失效队列。我不确定这部分是如何工作的。特别是,您似乎暗示循环通过正常读取(即,非锁定,没有障碍,并且仅使用 volatile 以确保优化器在编译后离开读取)每次都会检查“无效队列” (如果存在这样的事情)。如果一个简单的读取不够好(即可以读取一个旧的缓存行,它仍然显示为有效等待队列失效(这对我来说也有点不连贯,但是失效队列是如何工作的呢?)),那么原子读取将是必要的,我的问题是:在这种情况下,这会对公共汽车有什么影响吗?(我认为可能不会。)

我仍在阅读英特尔手册,虽然我看到了关于存储转发的精彩讨论,但我还没有找到关于失效队列的很好讨论。我决定将我的 C 代码转换为 ASM 并进行实验,我认为这是真正了解其工作原理的最佳方式。

0 投票
3 回答
14192 浏览

gcc - 使用 cmpxchg 的 x86 自旋锁

我是使用 gcc 内联汇编的新手,想知道在 x86 多核机器上,自旋锁(没有竞争条件)是否可以实现为(使用 AT&T 语法):

0 投票
0 回答
497 浏览

cocoa - 什么可能导致 ImageProviderReleaseInfoCallback / __spin_lock 死锁

我有一个 Cocoa 应用程序,它使用多个NSOperationQueue实例在后台处理图像。每个队列处理调用操作,这些调用操作本质上使用以下方法将NSImage对象转换为CGImageRef实例:

一些用户抱怨该应用程序突然停止响应。我要求他们使用 ActivityMonitor.app 收集流程样本。这些报告都非常相似。

看起来主线程正在通过自动释放池drain,而队列/线程在__spin_lock调用ImageProviderReleaseInfoCallback.

文档说所有参数CGImageForProposedRect:都是可选的。如果可以从后台线程调用它,他们什么也不会说。也许这就是问题所在?我对此表示怀疑,因为它几乎适用于所有情况(我启动该应用程序数百次都没有问题......)

任何想法为什么队列会卡住?

全流程样本:

0 投票
3 回答
8339 浏览

c - 为什么拿着自旋锁时不允许“睡觉”?

可能重复:
为什么拿着自旋锁不能睡觉?

据我所知,自旋锁应该在短时间内使用,并且只是代码中的选择,例如不允许休眠(抢占)的中断处理程序。

但是,我不知道为什么会有这样一个“规则”,即在持有自旋锁时根本不应该睡觉。我知道这不是推荐的做法(因为它不利于性能),但我认为没有理由不应该在自旋锁中允许睡眠。

在获取信号量时不能持有自旋锁,因为在等待信号量时可能需要休眠,并且在持有自旋锁时不能休眠(来自 Robert Love 的“Linux Kernel Development”)。

我能看到的唯一原因是出于可移植性的原因,因为在单处理器中,自旋锁被实现为禁用中断,并且通过禁用中断,当然不允许休眠(但休眠不会破坏 SMP 系统中的代码)。

但我想知道我的推理是否正确,或者是否还有其他原因。

0 投票
3 回答
2423 浏览

javascript - Javascript 中的自旋锁

我怎样才能在javascript中做一个自旋锁?

我正在尝试加载一堆图像,并且只有在加载完所有内容后才能继续前进,所以我有一个类似的自旋锁

它使我的浏览器崩溃。有更好的方法吗?还是我缺少的产量/睡眠功能?

0 投票
4 回答
5744 浏览

macos - Mac OS X 有 pthread_spinlock_t 类型吗?

我没有在 Mac 中找到它,但几乎所有的 Linux 操作系统都支持它.. 有人知道如何将它移植到 mac 上吗?

0 投票
1 回答
1246 浏览

windows - 为什么 Windows XP 和 Windows 7 的自旋锁实现不同?

我知道自旋锁是由 Windows 中的 hal.dll 导出的,所以我对自旋锁的代码进行了逆向工程。结果如下。

Windows XP 的反编译自旋锁。

Windows 7 的反编译自旋锁。

为什么版本之间的代码不同?特别是,我看不到 Windows 7 版本中添加的代码如何提高自旋锁在虚拟化中的性能。