2011-02-17 51 views
1

看起来,自旋锁不是很好,因为它们在等待(阻塞)时浪费CPU周期。 如果线程刚好在等待唤醒信号时进入休眠状态,那么在旋转时CPU周期不会丢失。什么时候使用螺旋锁是一个好主意?

如果锁持有非常短的时间,也许使用自旋锁很好,那么它可能使用更少的时间?如果这是真的,为什么?

+0

你可能想看看关于这一主题的维基百科条目(http://en.wikipedia.org/wiki/Spinlock)。它似乎非常丰富。 :) – gbvb 2011-02-17 04:02:12

回答

3

是的,这是正确的。

因为上下文切换很贵。操作系统和CPU必须执行(相对)大量的工作来执行上下文切换。纺纱几个周期反而会便宜很多,即使这些周期在理论上浪费了。

1

自旋锁不阻挡时速度更快,这就是为什么它们在锁中争用非常少(即锁定的可能性非常低)的情况下非常有用。

当一个线程休眠时,它会导致一个上下文切换(即,该线程被换出另一个线程,以便另一个线程可以运行)。获取标准互斥锁的开销通常比检查自旋锁是否空闲的开销要高。当锁定空闲时,通常自旋锁只需要一次原子操作。

这些属性使自旋锁对细颗粒锁定有用,因为使用较小的锁可减少每个锁的争用。例如,我的一个项目有一个映射,其中约有200,000个条目同时被16个以上的线程访问(企业服务器类型的东西)。每个条目有一个自旋锁是非常有效的,因为这个应用程序中的两个线程尝试同时击中相同条目的机会很低。

0

当锁定变为可用时,自旋锁允许紧密轮询和更快的唤醒。 @Chris指出,它们也适用于非竞争锁。我会说使用自旋锁:

  1. 如果所有你关心的是你自己的应用程序的性能,又不想屈服于其他应用和你的应用程序有< =线程比内核的数量。 我仍然会考虑票据锁,以优化缓存未命中......但它们也会旋转,但会减少缓存未命中的次数。

  2. ,或者,如果你的锁较少争

相关问题