我总是想知道它们是什么:我每次听到他们的时间,未来飞轮类设备的图像去在我的脑海...

跳舞(滚?)

它们是什么?

有帮助吗?

解决方案

当你使用普通的锁(互斥,临界区等),操作系统把你的线程处于等待状态和的通过在相同的核心调度其他线程抢占它。这有性能损失,如果等待时间是非常短的,因为你的线程现在必须等待抢占再次接收CPU时间。

除了

,内核对象不可在内核的每一个状态,如在中断处理程序,或当寻呼不可用等

自旋锁不会引起抢占而是等待在一个循环(“旋转”)直至其他核心释放锁。这可以防止线程失去其量子并尽快继续锁定得到释放。自旋锁的简单的机构允许内核利用它在几乎任何状态。

这就是为什么单核机器上的自旋锁是一个简单的“禁用中断的”或“提高IRQL”防止完全线程调度。

自旋锁最终允许内核,以避免“大内核锁” S(获取的锁定时内核进入内核和在出口处释放),并具有超过内核原语粒状锁定,在多核心机从而更好的性能造成更好的多处理

编辑:一个问题来了:“那是不是意味着只要有可能,我应该用自旋锁?”我会试着回答吧:

正如我所提到的,自旋锁仅在预期的地方有用等待时间比量子短(读:毫秒)和占先没有多大意义(例如内核对象是不可用)。

如果等待时间是未知的,或者如果您在用户模式下自旋锁是效率不高。你就等着核心消耗100%的CPU时间,同时检查,如果一个自旋锁是可用的。您阻止其他线程,直到你的量子到期该内核上运行。此方案是仅在内核层和不太可能的选项为用户模式应用程序短脉冲可行的。

下面是SO解决这一问题:自旋锁,如何有用的是他们“? / A>

其他提示

假设一个资源被锁定,想要访问的资源需要首先获得锁的线程保护。如果锁不可用,线程可能会反复检查,如果锁已被释放。在此期间,该线程忙等待,检查锁,使用CPU,但没有做任何有用的工作。这种锁被称为自旋锁。

这是相当多的一个循环,不断下去,直到一定的条件是:

while(cantGoOn) {};
 while(something != TRUE ){};
 // it happend
 move_on();

这是一个类型的锁,做忙等待

它被认为反模式,除了非常低级别的驱动程序(它可能发生,调用“适当”等功能,具有比根本忙不过来锁定几个周期更多的开销)。

请参阅例如自旋锁在Linux内核

自旋锁是在哪个线程等待直到锁可用的那些。这通常被用于避免获取内核对象的开销时,有取得一些小的时间周期内的内核对象的范围。

例如:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object

您会想,当你认为它是便宜进入忙等待循环,集中资源而不是阻塞当资源被锁定的使用自旋锁。

  

纺丝可以是有益的,当锁细粒度和数量上是大的(例如,在链接列表中每个节点的锁),以及当锁定保持时间总是非常短。在一般情况下,同时保持一个自旋锁,应该避免阻塞,调用任何本身可能会阻塞,保持多于一个的自旋锁一次,动态地使出动调用(接口和虚函数),使得静态分派呼叫到任何一个代码没有按” Ť自己的,或分配存储器。

     

这也是必须注意的是自旋锁是一个值类型,性能方面的原因。因此,我们必须非常小心,不要意外地复制一个自旋锁的实例,因为这两个实例(原件和复印件),然后将完全独立的,这可能会导致应用程序的错误行为。如果自旋锁实例必须绕过,应该通过引用而不是通过值传递。

在简单地说,螺旋锁采用原子比较和交换(CAS)或检查并设置等来实现锁自由的,等待自由线程安全成语指令。这种结构在多核机器很好地扩展。

这是直到条件满足该打转的循环。

嗯,是的 - 自旋锁点(与传统的临界区等)为他们提供在某些情况下更好的性能(多核系统..),因为他们没有立即产生线程的量子其余。

自旋锁,是一种类型的锁,其是非块能够与非睡眠能。它希望获得任意共享或关键资源自旋锁的任何线程将不断旋转,浪费了CPU的处理周期,直到它获得指定的资源的锁。一旦自旋锁被获取,它试图完成其量子的工作,然后分别释放资源。自旋锁是锁定的最高优先级的类型,简单地可以说,它是非抢占类型的锁。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top