我想知道Threading.Thread.SpinWait方法和Threading.SpinWait结构之间是否有什么区别。
特别是,在应用程序中实现spinwait的惯用方式是什么:
Thread.SpinWait(1);或
SpinWait spinWait = new SpinWait();
// ...
spinWait.SpinOnce();发布于 2021-11-11 08:44:16
原来,文档的SpinWait结构建议不要直接使用Thread.SpinWait()方法。正确的方法是:
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封装它,使其在几乎所有情况下都能很好地工作。
https://stackoverflow.com/questions/69925397
复制相似问题