首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无锁更新中的SpinWait

无锁更新中的SpinWait
EN

Stack Overflow用户
提问于 2016-06-13 21:24:43
回答 1查看 330关注 0票数 3

在阅读Albahari在C#中的线程处理时,我注意到“无锁更新”模式在循环结束时使用了一个SpinWait

代码语言:javascript
复制
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()调用。该调用是否仅用于在单线程环境中生成线程,还是有其他用途?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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方法更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37799381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档