在研究 .net 提供的同步原语时,我遇到了 SpinLock 和 SpinWait。从表面上看,在我看来,SpinWait 永远是可行的方法..当线程实际上必须等待来自线程外部的信号时,为什么要继续忙于等待而不放弃 CPU?在这些空闲等待中花费的周期可能被线程使用,该线程将发信号并解除阻塞正忙等待的线程。
为什么存在 SpinLock?它与使用 while 循环的简单忙等待有何不同?在什么情况下人们会想使用 SpinLock 而不是 SpinWait?
最佳答案
通常,自旋锁的实现已经了解如何避免剥夺其他核心(或共享该核心的其他线程)的执行资源。因此,您不必担心与会解锁您的线程发生冲突。当然,自旋锁的次优实现并不是很有用。 (尽管这并不能阻止人们写它们!)
如果您知道等待时间会很短,因为只在完成琐碎操作时才保留锁,那么自旋锁的开销比切换到等待的自适应自旋锁要少一些。一个很好的例子是一个锁,它可以保护竞争激烈的快速集合(例如哈希),并且仅在几乎所有线程都访问该应用程序的集合中插入、删除或找到对象时才保留该锁。收藏。
关于c# - 既然有SpinWait,为什么还要使用SpinLock呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34647224/