为什么在SpinWait时使用SpinLock?

时间:2016-01-07 04:10:21

标签: c# multithreading synchronization

在研究.net提供的同步原语时,我遇到了SpinLock和SpinWait。从它的外观来看,在我看来,SpinWait永远是你要走的路。为什么当线程必须实际等待来自线程外部的信号时,一个人继续忙着等待而不放弃CPU?在这些空闲等待中花费的周期可能已被线程使用,该线程将单独和解除忙于等待的线程。

为什么SpinLock存在?是什么让它与使用while循环的简单忙等待不同?在什么情况下人们想在SpinWait上使用SpinLock?

1 个答案:

答案 0 :(得分:3)

通常,自旋锁的实现已经了解如何避免剥夺其他核心(或共享此核心的其他线程)的执行资源。所以你不必担心打击那些会阻止你的线程。当然,自旋锁的次优实现不是一件非常有用的事情。 (虽然这并不能阻止人们写作!)

如果您知道等待的时间非常短,因为仅在完成琐碎操作时保持锁定,则自旋锁的开销比切换到等待的自适应旋转锁少一点。一个很好的例子是一个保护严重争用的快速集合(例如散列)的锁,只有当一个对象在一个应用程序中插入,删除或找到的应用程序中保持,而几乎所有线程都访问该应用程序。集合。