10

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


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

4

3 回答 3

5

几乎任何低锁并发集合类都可能使用SpinWait和的某种组合Yield。虽然ConcurrentDictionary是一个值得注意的例外。我找到的课程列表包括以下内容。

  • ManualResetEventSlim
  • SemaphoreSlim
  • 自旋锁
  • 屏障
  • ReaderWriterLockSlim
  • 并发队列
  • 并发栈
  • 阻塞集合
于 2011-06-28T21:16:26.267 回答
4

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

如果是,你应该看看ConcurrentStack例如,它使用 aSpinWait来完成它的工作。

于 2011-06-28T12:05:33.800 回答
2

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

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

于 2011-08-12T02:41:16.220 回答