在阅读 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/

10-12 22:46