什么提供自旋锁效果?

Pav*_*nin 3 .net multithreading spinlock

自旋锁仅在具有真正并行性的系统上有效,即多核/处理器系统.由于他们的设计,这并不奇怪.

但是,共享资源的线程必须在不同的核心上执行.否则情况类似于单处理器系统.

只是概率问题或调度程序试图将互锁线程放在不同的CPU上以提供真正的并发性?

Han*_*ant 5

线程上下文切换的成本是自旋锁有用的原因.对于Windows上的交换机,引用的通常数字是2000到10,000个cpu周期.由于保证缓存未命中而必须存储和重新加载处理器状态和停顿所关联的成本.这是纯粹的开销,没有什么有用的.

因此,如果程序等待锁定可用,燃烧数千个周期并定期尝试进入锁定,则程序可以执行得更好.如果预期锁可以快速获得,则可以避免上下文切换.

没有定时器可用于等待如此短的持续时间,它是通过实际燃烧循环的小循环来实现的.纺纱.这在处理器级别受支持,专用的PAUSE机器代码指令可用于降低在Intel/AMD内核上旋转时所消耗的功率..NET中的Thread.Yield()和Thread.SpinWait()利用它.

实际上在代码中有效使用自旋锁可能很棘手,当然只有获得锁的几率足够高才能正常工作.如果它们不是那么自旋锁是主动有害的,因为它延迟了一个上下文切换,一个可能需要让另一个线程重新获得处理器并释放锁..NET 4.0 SpinLock类很有用,它为失败的旋转生成ETW事件.没有其他文件证明.