在阅读Albahari's Threading in C#时,我注意到“无锁更新”模式SpinWait
在循环结束时使用 a :
static void LockFreeUpdate<T> (ref T field, Func <T, T> updateFunction)
where T : class
{
var spinWait = new SpinWait();
while (true)
{
// read
T snapshot1 = field;
// apply transformation
T calc = updateFunction (snapshot1);
// compare if not preempted
T snapshot2 = Interlocked.CompareExchange (ref field, calc, snapshot1);
// if succeeded, we're done
if (snapshot1 == snapshot2) return;
// otherwise spin
spinWait.SpinOnce();
}
}
注意最后的spinWait.SpinOnce()
调用。这个调用是否只需要在单线程环境中产生线程,还是有其他目的?