Spin-wait 是什么 wound wait 多进程

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 04:00:27
Spin-wait 是什么 wound wait 多进程
xTSIW&ٳeO{۪VFZ1)ko0`AP20돓B^J{^/oL<]@XG#1Nfp^__K+7{vy˪y,L,L |aV%c/yqY 5!M^ZA x]vZa,< o. ?4o,5"ih)~ܐIȺ`9#y L?PVs@8>᥌|AH㊘WHμ,>. ay`> C:ʳI l c:y,GY -lYK)\AyxDj3jPKThxвN)"nfhH"줍=94,_׈Oq5,/+^OP>O 8Z,  ,]/tiSR^"l§}5T /V,ksrOC(a]IE>dfgQg{&? 24sm%ۑwU}`Q{o?GGT`.K1p"YY`2^z7zA'*zEfjː5{;"ܢɼ~[™7ʫ!

Spin-wait 是什么 wound wait 多进程
Spin-wait 是什么 wound wait 多进程

Spin-wait 是什么 wound wait 多进程
可重用旋转等待 (Spin Wait)
虽然忙碌等待 (busy waiting) 更容易实现阻塞,但在某些情况下,您也许的确想在退回到真正的等待状态前先旋转 (spin) 一段时间.我们很难理解为何这样做会有帮助,而大多数人之所以一开始就避免旋转等待,是因为旋转看上去像是在做无用功;如果上下文切换(每当线程等待内核事件时都会发生)需要几千个周期(在 Windows 上确实是这样),我们称之为 c,并且线程所等待的条件出现的时间少于 2c 周期时间(1c 用于等待自身,1c 用于唤醒),则旋转可以降低等待所造成的系统开销和滞后时间,从而提升算法的整体吞吐量和可伸缩性.
如果您决定使用旋转等待,就必须谨慎行事.因为如果这样做,您可能需要注意很多问题,比如:要确保在旋转循环内调用 Thread.SpinWait,以提高 Intel 超线程技术的计算机上硬件对其他硬件线程的可用性;偶尔使用参数 1 而非 0 来调用 Thread.Sleep,以避免优先级反向问题;通过轻微的回退 (back-off) 来引入随机选择,从而改善访问的局部性(假定调用方持续重读共享状态)并可能避免活锁;当然,在单 CPU 的计算机最好不要采用这种方法(因为在这种环境下旋转是非常浪费资源的).
SpinWait 类需要被定义为值类型,以便分配起来更加节省资源