Thread.SpinWait方法的目的是什么?
从MSDN的目的不是很清楚。
它可以用来模拟一个密集的CPU计算testing吗?
没有。 它被用作非常短期的睡眠呼叫的替代品。
当你进行multithreadinglocking时,如果你试图获取的资源已经被locking,你通常会进入hibernate状态并等待它自由。 当你这样做的时候,你放弃了由调度程序分配的其余时间来使用处理器,这样别人就可以开始工作了。 通常情况下,这很好,特别是对于长时间的等待,比如等待IO,在等待磁盘主轴旋转时,其他进程的负载可以在CPU上运行。
但是,有时候,你只是在等待一小段时间。 在这些情况下,你通常会放弃你的剩余时间,等待所有其他线程去做他们的事情,然后再去…所以你可以作弊,而不是等待,你坐在那里不断轮询在“我们差不多那里呢? 办法。 如果锁只剩下一小部分剩余时间,这就成为一个非常有效的等待方式,它也非常有效,因为调度程序不需要重新安排所有其他线程来使用你放弃的时间如果你正常等待。
很显然,如果你每次想要locking时都旋转,那么你不会很受欢迎,你的应用程序会变得很慢,并且使用100%的CPU,但是在非常小的剂量下,在正确的时间,它会使应用程序响应更快。
如果你现在想着'我该什么时候使用它',那么这是一个棘手的问题 – 如果你有一个经常被locking和解锁的资源,那么围绕它而不是等待是一个好主意(然后testing应用程序的性能),如果尝试短时间旋转,然后又回到正常的等待状态,那也是合理的。 但通常情况下,您将永远不需要使用它。
目的是要做一个“便宜”的等待,如果你相信你所期待的状况很快就会实现 。 通常情况下,如果你在等待什么东西,就让线程进入hibernate状态,处理器/操作系统将上下文切换到另一个线程。 上下文切换并不是特别便宜,所以如果你有先进的情况知识,并且认为等待上下文切换比较便宜,那么就等待。
我的build议:如果你需要问,你不需要使用它。 (我从来没有想过要这样做)基本上这是在极less数情况下真正有用的东西之一,但大多数人应该保持良好的状态。
作为一个方面说明,微软已经摆脱了Windows 7的线程调度器螺旋锁机制,因为它不能很好地适应多核CPU。 看看这个 :
就我而言(我很乐意进行更正!),spin等待的唯一用处是实现locking或线程间callback机制。 而且都不应该手动(通常),因为它们已经存在。
当你locking一个资源,另一个线程请求对它的同步访问时,它基本上必须等待第一个线程完成使用它。 这个等待可以通过简单的循环来完成(或者如Jon提到的那样,睡眠+上下文切换)。