首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Threading.SpinWait结构与Thread.SpinWait方法

Threading.SpinWait结构与Thread.SpinWait方法
EN

Stack Overflow用户
提问于 2021-11-11 08:44:16
回答 1查看 198关注 0票数 3

我想知道Threading.Thread.SpinWait方法和Threading.SpinWait结构之间是否有什么区别。

特别是,在应用程序中实现spinwait的惯用方式是什么:

代码语言:javascript
复制
Thread.SpinWait(1);

代码语言:javascript
复制
SpinWait spinWait = new SpinWait();
// ...
spinWait.SpinOnce();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-11 08:44:16

原来,文档的SpinWait结构建议不要直接使用Thread.SpinWait()方法。正确的方法是:

代码语言:javascript
复制
SpinWait spinWait = new SpinWait();
// ...
spinWait.SpinOnce();

SpinWait封装了常见的旋转逻辑。在单处理器机器上,产量总是被用来代替繁忙的等待,而在采用超线程技术的英特尔处理器的计算机上,它有助于防止硬件线程饥饿。SpinWait封装了良好的纺丝和真屈服的混合物。SpinWait是一种值类型,这意味着低级代码可以利用SpinWait,而不必担心不必要的分配开销。对于普通应用程序来说,SpinWait通常并不有用。在大多数情况下,您应该使用.NET框架提供的同步类,例如监视器。然而,在大多数需要自旋等待的情况下,应该比Thread.SpinWait方法更倾向于SpinWait类型。

SpinWait添加了一些细节:

在当前的实现中,SpinWait在生成之前执行CPU密集型旋转10次。但是,在每一个循环之后,它都不会立即返回给调用者:相反,它调用Thread.SpinWait通过CLR (最终是操作系统)旋转一段时间。这个时间段最初是几十纳秒,但每次迭代都会加倍,直到10个迭代结束为止。这确保了CPU密集型旋转阶段的总时间的可预见性,CLR和操作系统可以根据情况进行调整。通常情况下,它是在几十微秒的范围内--很小,但超过了上下文切换的成本。在单核机器上,SpinWait在每一次迭代中都会产生结果。您可以测试SpinWait是否会通过属性NextSpinWillYield在下一次旋转中屈服。如果一个SpinWait保持在“自旋生成”模式下足够长的时间(可能是20个周期),它将周期性地休眠几毫秒,以进一步节省资源和帮助其他线程的进程。

简而言之,据我所知,Threading.Thread.SpinWait进行实际的旋转,而Threading.SpinWait封装它,使其在几乎所有情况下都能很好地工作。

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

https://stackoverflow.com/questions/69925397

复制
相关文章

相似问题

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