.net Thread.SpinWait在单核CPU上有何用处?

.net Thread.SpinWait在单核CPU上有何用处?,.net,multithreading,.net,Multithreading,在单核机器上,如果正在运行的线程spin等待只是因为它正在等待另一个线程当前持有的锁的释放,那么spin等待不是浪费CPU时间吗,因为当前持有锁的线程仍然在等待队列中 因此,spin等待锁的释放是否仅在具有多核的机器上才有价值 就这点而言,这个问题也适用于所有Slim对象,例如SemaphoreSlim和ReaderWriterLockSlim。是的,自旋等待在单核机器上是无用的,而且会产生反效果——但这样的机器越来越少见 .NET4.0引入了更高级的结构。如果在单核机器上使用,它将立即放弃当前

在单核机器上,如果正在运行的线程spin等待只是因为它正在等待另一个线程当前持有的锁的释放,那么spin等待不是浪费CPU时间吗,因为当前持有锁的线程仍然在等待队列中

因此,spin等待锁的释放是否仅在具有多核的机器上才有价值


就这点而言,这个问题也适用于所有
Slim
对象,例如
SemaphoreSlim
ReaderWriterLockSlim

是的,自旋等待在单核机器上是无用的,而且会产生反效果——但这样的机器越来越少见

.NET4.0引入了更高级的结构。如果在单核机器上使用,它将立即放弃当前线程的时间片,并允许在其他线程上取得进展,因为忙着等待任何长度的时间只会占用处理器。(从这个意义上讲,自旋等待对于单核机器上的硬件驱动程序仍然有意义,因为硬件可以在后台取得进展,但硬件驱动程序当然不是用IL编写的。)

类似地,
*Slim
类型如果在单芯机器上使用,则不会使用旋转。在可能的情况下,它们仍然值得使用,因为与非
Slim
对应项不同,它们被编写得更快、更简单,并且需要更少的资源(
Semaphore
由内核对象支持,例如,
SemaphoreSlim
不是)


一般来说,无论内核的数量如何,您都应该选择
*Slim
类型,如果确实需要旋转,则应使用
SpinWait
结构(除非您正在实现自己的同步原语,否则几乎不会),因为它实际上不会旋转,除非这样做是有意义的。

我相信你的假设是正确的,但我没有事实来支持我的假设,所以我不会将其作为答案发布。@ScottChamberlain谢谢你。当你做非常短的(低于15毫秒)时,旋转等待也会很有用等待速率限制位循环代码。(超过66赫兹,你需要在循环之间进行自旋等待)@ScottChamberlain谢谢。什么是速率限制循环?我在哪里可以读到它?@JeroenMosterf,非常感谢。@WaterCoolerv2您希望每10毫秒运行一次的代码集(例如,从传感器读取)将是速率限制循环(因为您等待10毫秒通过,然后再执行一次)(因为您正在多次执行该操作)@斯科特汉姆伯伦谢谢你。你是怎么读的,从哪里读的?我很着迷,但我甚至不知道这是什么主题,它们在哪里,它们被称为什么,从哪里读到它们。