【问题标题】:Are there any examples in the .Net framework that use spinlock or spinwait?.Net 框架中是否有使用自旋锁或自旋等待的示例?
【发布时间】:2011-09-24 05:53:56
【问题描述】:

我查看了并发集合,但它们似乎在底层使用了普通锁定。 .Net 框架中有没有使用这种锁定结构的好例子?


我最初查看的是 ConcurrentDictionary。我看到它使用的是普通锁,但 BlockingCollection 类在其内部方法中使用了 SpinWait。

【问题讨论】:

  • 你为什么要这样做?自旋锁是一种忙碌的等待机制,即使用资源而不做任何有用的事情
  • 纯教育。我认为我永远不需要这样做。但我只是想了解更多信息并看一个像样的例子。大多数例子充其量都是人为的。
  • 在我看来,你似乎无法找到现实生活中的例子已经说明了很多。
  • @Daniel: true :)。但他们把它包括在内是有原因的。我只是想了解更多。

标签: .net multithreading spinlock spinwait


【解决方案1】:

ConcurrentStack 和 ConcurrentQueue 是无锁集合,但 ConcurrentDictionary、ConcurrentBag 使用锁。 BlockingCollections 只是一个容器,因此它本身不是一个集合,它必须包装其他线程安全集合,例如 var bc = new BlockingCollection(new ConcurrentStack());

这是一篇关于如何在无锁代码中使用 SpinWait 的介绍性文章 http://www.emadomara.com/2011/08/spinwait-and-lock-free-code.html

【讨论】:

    【解决方案2】:

    几乎所有低锁并发集合类都可能使用SpinWaitYield 的某种组合。尽管ConcurrentDictionary 是一个值得注意的例外。我找到的类列表包括以下内容。

    • ManualResetEventSlim
    • SemaphoreSlim
    • 自旋锁
    • 屏障
    • ReaderWriterLockSlim
    • 并发队列
    • 并发堆栈
    • 阻塞集合

    【讨论】:

      【解决方案3】:

      正常锁定是什么意思?某种lock(object) { ... } 构造?

      如果是,您应该查看ConcurrentStack,例如,它使用SpinWait 来完成工作。

      【讨论】:

        猜你喜欢
        • 2016-11-02
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 2011-09-13
        • 1970-01-01
        • 2013-12-28
        • 2011-06-11
        相关资源
        最近更新 更多