首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread.SpinWait方法的目的是什么?

Thread.SpinWait方法的目的是什么?
EN

Stack Overflow用户
提问于 2009-07-07 08:56:49
回答 4查看 25.6K关注 0票数 60

MSDN来看,它的目的并不是很明确。

它可以用来模拟密集的CPU计算测试吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-07 09:08:22

不是的。它被用来替代非常短期的睡眠呼叫。

当您执行多线程锁定时,如果您尝试获取的资源已经被锁定,您通常会进入睡眠状态,并等待它变为空闲状态。当您这样做时,您放弃了调度器分配给您使用处理器的剩余时间,这样其他人就可以开始使用了。通常这是很好的,特别是对于长时间的等待,例如等待IO,当您等待磁盘轴旋转时,其他进程的负载可以在CPU上运行。

但是,有时,您需要等待很短的时间。在这些情况下,您通常会放弃您的剩余时间,并等待所有其他线程完成它们的事情,然后再获得另一次执行。所以你可以作弊,而不是等待,你坐在那里不断地问‘我们快到了吗?’道路。如果锁只持有你剩余时间的一小部分,这将成为一种非常有效的等待方式,它也非常有效,因为调度器不必参与重新安排所有其他线程来使用你正常等待时放弃的时间。

显然,如果你每次想要一个锁的时候都旋转,你就不会很受欢迎,你的应用程序会变得迟缓,并使用100%的CPU,但在非常小的剂量下,在正确的时间,它会使应用程序更具响应性。

如果你现在在想“我应该在什么时候使用它?”,这是一个棘手的问题--如果你有一个经常被快速锁定和解锁的资源,那么绕过它而不是等待是一个好主意(然后测试你的应用程序的性能),如果你试着旋转一小段时间,然后回到正常的等待,这也是一个合理的方式。但一般来说,您永远不需要使用它。

票数 107
EN

Stack Overflow用户

发布于 2009-07-07 09:00:23

这样做的目的是,如果你相信你等待的条件很快就会实现,那就做一个“廉价”的等待。通常情况下,如果你在等待什么,你让线程进入睡眠状态,处理器/OS将上下文切换到另一个线程。上下文切换并不是特别便宜,所以如果您对这种情况有深入的了解,并且认为等待比上下文切换更便宜,那么您可以旋转等待。

我的建议是:如果你需要询问,你不需要使用它。(我自己从来不想要它。)基本上,它是在极少数情况下真正有用的东西之一,但大多数人应该远离它。

票数 76
EN

Stack Overflow用户

发布于 2009-07-07 09:44:57

顺便说一句,微软已经从Windows7中去掉了线程分派器的自旋锁机制,因为它不能很好地扩展到多核处理器。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1091135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档