Thread.SpinWait如何在单核CPU上发挥作用?

时间:2016-06-01 20:58:03

标签: .net multithreading

在单核心机器上,如果正在运行的线程只是因为等待释放另一个线程当前持有的锁而等待,那么旋转等待不会浪费CPU时间,因为线程是目前在等待队列中持有锁是什么?

因此,是否只在具有多个内核的机器上等待释放有价值的锁?

就此而言,此问题也适用于所有Slim对象,例如SemaphoreSlimReaderWriterLockSlim

1 个答案:

答案 0 :(得分:3)

是的,旋转等待在单核机器上毫无用处且适得其反 - 但这种机器越来越少见。

.NET 4.0引入了更高级的SpinWait结构。如果在单核机器上使用它,它将立即放弃当前线程的时间片并允许在其他线程上进行,因为忙于等待任何时间长度除了支撑处理器之外什么都不做。 (在这种意义上,旋转等待对硬件驱动程序仍然有意义,即使在单核机器上,因为硬件可以在后台取得进展,但硬件驱动程序当然不是用IL编写的。)

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

一般情况下,无论核心数量多少,您都应该更喜欢*Slim类型,如果您确实需要旋转,则应使用SpinWait结构(几乎从不,除非您实现自己的同步原语) ,因为除非有意义,否则它实际上不会旋转。