在阅读Albahari在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()调用。该调用是否仅用于在单线程环境中生成线程,还是有其他用途?
发布于 2016-06-13 21:50:48
简单回答..。是。SpinWait的目的是允许将线程生成到系统,这样就不会因为SpinLock而需要处理。
来自MSDN
https://msdn.microsoft.com/en-us/library/system.threading.spinwait(v=vs.110).aspx
SpinWait封装了常见的旋转逻辑。在单处理器机器上,产量总是被用来代替繁忙的等待,而在采用超线程技术的英特尔处理器的计算机上,它有助于防止硬件线程饥饿。SpinWait封装了良好的纺丝和真屈服的混合物。 SpinWait是一种值类型,这意味着低级代码可以利用SpinWait,而不必担心不必要的分配开销。对于普通应用程序来说,SpinWait通常并不有用。在大多数情况下,您应该使用.NET框架提供的同步类,例如监视器。然而,对于大多数需要自旋等待的目的,SpinWait类型应该比SpinWait方法更好。
https://stackoverflow.com/questions/37799381
复制相似问题