int x; void MultiplyXBy (int factor) { var spinWait = new SpinWait(); while (true) { int snapshot1 = x; Thread.MemoryBarrier(); int calc = snapshot1 * factor; int snapshot2 = Interlocked.CompareExchange (ref x, calc, snapshot1); if (snapshot1 == snapshot2) return; // 没有被抢占 spinWait.SpinOnce(); } }
do{ Thread.SpinWait(10); //自旋10毫秒 Thread.Sleep(10); //休眠10毫秒 }while(true); 结果:Thread.SpinWait(10); CPU被占满 100% —— “自旋” (这个词的意思 或许就是说:没事做的时候,也要折腾一点事儿出来)。 —————————————————————— 当然: Thread.SpinWait(10); 精度准一点(没有线程的 唤醒时间,休眠10ms,实际休眠 10.001 ms) Thread.Sleep(10); 精度差一点(有线程的 唤醒时间,休眠10ms,实际休眠 10.1 ms)