1

似乎自旋锁并不是那么好,因为它们在等待(阻塞)时会浪费 CPU 周期。如果线程只是在等待唤醒信号时进入睡眠状态,那么 CPU 周期在旋转时不会丢失。

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

4

3 回答 3

3

对,那是正确的。

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

于 2011-02-17T04:01:31.823 回答
3

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

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

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

于 2011-02-17T04:09:08.123 回答
0

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

  1. 如果您只关心自己应用程序的性能,并且不想屈服于其他应用程序并且您的应用程序的线程数小于内核数。但是,我仍然会考虑票证锁定以优化缓存未命中……它们也会旋转,但会大大减少缓存未命中。

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

于 2011-05-10T01:00:49.650 回答