在单个核心机器上,如果正在运行的线程旋转仅仅因为等待另一个线程当前持有的锁的释放而等待,那么旋转不是浪费CPU时间吗?因为当前持有锁的线程仍然处于等待队列中?
因此,只有在有多个核心的机器上,旋转才能等待锁的释放吗?
因此,这个问题也适用于所有Slim对象,如SemaphoreSlim和ReaderWriterLockSlim。
发布于 2016-06-01 21:20:34
是的,在单核机器上,旋转等待是无用的,也是适得其反的--但这样的机器越来越罕见。
.NET 4.0引入了更高级的SpinWait结构。如果在单核机器上使用,它将立即放弃当前线程的时间片段,并允许在其他线程上取得进展,因为忙于等待任何时间只会阻塞处理器。(从这个意义上说,旋转等待对于硬件驱动程序来说仍然是有意义的,即使在单个核心计算机上也是如此,因为硬件可以在后台取得进展,但是硬件驱动程序当然不是用IL编写的。)
类似地,如果在单核机器上使用,*Slim类型将不会使用旋转。在可能的情况下,它们仍然值得使用,因为与它们的非Slim对应项不同,它们的编写更快、更简单,并且需要更少的资源(例如,SemaphoreSlim不是由内核对象支持的)。
通常,不管核心数量多少,您都应该更喜欢*Slim类型,如果您确实需要旋转(除非您正在实现自己的同步原语),则应该使用SpinWait结构(除非您正在实现您自己的同步原语),因为除非这样做有意义,否则它不会实际旋转。
https://stackoverflow.com/questions/37578650
复制相似问题