在阅读 Albahari's Threading in C# 时,我注意到“无锁更新”模式在循环结束时使用了 SpinWait
:
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()
调用。这个调用是否只需要在单线程环境中产生线程,还是有其他目的? 最佳答案
简短的回答......是的。 SpinWait
的目的是允许将线程交给系统,以免由于 SpinLock
导致处理不足。
来自 MSDN
https://msdn.microsoft.com/en-us/library/system.threading.spinwait(v=vs.110).aspx
关于c# - 无锁更新中的 SpinWait,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37799381/