Thread.SpinWait有什么用!

来源:百度知道 编辑:UC知道 时间:2024/05/30 04:27:51
请各位大哥指教这个方法的使用方法

可重用旋转等待 (Spin Wait)

虽然忙碌等待 (busy waiting) 更容易实现阻塞,但在某些情况下,您也许的确想在退回到真正的等待状态前先旋转 (spin) 一段时间。我们很难理解为何这样做会有帮助,而大多数人之所以一开始就避免旋转等待,是因为旋转看上去像是在做无用功;如果上下文切换(每当线程等待内核事件时都会发生)需要几千个周期(在 Windows 上确实是这样),我们称之为 c,并且线程所等待的条件出现的时间少于 2c 周期时间(1c 用于等待自身,1c 用于唤醒),则旋转可以降低等待所造成的系统开销和滞后时间,从而提升算法的整体吞吐量和可伸缩性。

如果您决定使用旋转等待,就必须谨慎行事。因为如果这样做,您可能需要注意很多问题,比如:要确保在旋转循环内调用 Thread.SpinWait,以提高 Intel 超线程技术的计算机上硬件对其他硬件线程的可用性;偶尔使用参数 1 而非 0 来调用 Thread.Sleep,以避免优先级反向问题;通过轻微的回退 (back-off) 来引入随机选择,从而改善访问的局部性(假定调用方持续重读共享状态)并可能避免活锁;当然,在单 CPU 的计算机最好不要采用这种方法(因为在这种环境下旋转是非常浪费资源的)。

SpinWait 类需要被定义为值类型,以便分配起来更加节省资源

简单的说 Thread.SpinWait 就是让当前线程一直占用 CPU,一直到你指定的时间为止
优点事精确度很高,缺点是无法很好的调度 CPU 利用率