c# - 既然有SpinWait,为什么还要使用SpinLock呢?

标签 c# multithreading synchronization

在研究 .net 提供的同步原语时,我遇到了 SpinLock 和 SpinWait。从表面上看,在我看来,SpinWait 永远是可行的方法..当线程实际上必须等待来自线程外部的信号时,为什么要继续忙于等待而不放弃 CPU?在这些空闲等待中花费的周期可能被线程使用,该线程将发信号并解除阻塞正忙等待的线程。

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

最佳答案

通常,自旋锁的实现已经了解如何避免剥夺其他核心(或共享该核心的其他线程)的执行资源。因此,您不必担心与会解锁您的线程发生冲突。当然,自旋锁的次优实现并不是很有用。 (尽管这并不能阻止人们写它们!)

如果您知道等待时间会很短,因为只在完成琐碎操作时才保留锁,那么自旋锁的开销比切换到等待的自适应自旋锁要少一些。一个很好的例子是一个锁,它可以保护竞争激烈的快速集合(例如哈希),并且仅在几乎所有线程都访问该应用程序的集合中插入、删除或找到对象时才保留该锁。收藏。

关于c# - 既然有SpinWait,为什么还要使用SpinLock呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34647224/

相关文章:

c++ - 为什么不将临时对象传递给另一个线程会导致未定义的行为?

multithreading - Delphi TIdTcpServer 在 someTimeOut 后强制停止 IdSync

c# - 多线程代码使 Rhino Mocks 导致死锁

c# - C# (Mono) 是否具有特定于平台的宏

c# - 从 .netcore 应用程序运行时,GRPC Init 抛出 "IOException: Failed to bind port "

c# - microsoft.jet.OLEDB4​​ 提供程序未在本地计算机上注册

共同 friend 类的 C# 解决方法

linux - 按需同步到同一虚拟 Linux 主机上的空白集群?

synchronization - AAD 组和 MS 团队同步太慢

Java:从同步块(synchronized block)启动新线程时会发生什么?