3

在阅读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()调用。这个调用是否只需要在单线程环境中产生线程,还是有其他目的?

4

1 回答 1

2

简短的回答......是的。的目的SpinWait是允许将线程让给系统,以免由于SpinLock.

来自 MSDN

https://msdn.microsoft.com/en-us/library/system.threading.spinwait(v=vs.110).aspx

SpinWait 封装了常见的自旋逻辑。在单处理器机器上,总是使用产量而不是忙等待,而在采用超线程技术的英特尔处理器的计算机上,它有助于防止硬件线程不足。SpinWait 封装了旋转和真正屈服的良好组合。

SpinWait 是一种值类型,这意味着低级代码可以利用 SpinWait 而不必担心不必要的分配开销。SpinWait 通常不适用于普通应用程序。在大多数情况下,您应该使用 .NET Framework 提供的同步类,例如 Monitor。但是,对于需要旋转等待的大多数用途,应该首选 SpinWait 类型而不是 SpinWait 方法。

于 2016-06-13T21:50:48.763 回答