带锁或并发字典的字典?

时间:2012-03-26 07:31:46

标签: c# .net concurrency dictionary

在多线程应用程序中首选:  带有锁定对象的Dictionary 要么  Concurrency Dictionary

哪个有效,我为什么要使用其中一个?

编辑1:将Guid存储为键,将bool存储为值。

编辑2:超过2个工作线程和一个UI线程。

4 个答案:

答案 0 :(得分:6)

我会说你有以下选择。

一些新的Framework 4.0类:

  • ConcurrentDictionary。工作快速可靠。
  • ConcurrentBag。它是对象的无序集合,因此它的工作速度更快,但如果您不需要排序则适合。
  • ConcurrentStack。它是经典 LIFO (后进先出)数据结构的实现,提供线程安全访问,无需外部同步
  • ConcurrentQueue。它是一个线程安全的 FIFO (先进先出)集合

所有新的4.0类都运行得更快,但具有 levanovd 提到的一些功能。您可以找到这些课程的效果比较here

早期版本的一些经典解决方案:

如果我限制使用Framework v3.5,我会使用 Dictionary + ReaderWriterLock ReaderWriterLockSlim

答案 1 :(得分:4)

当您使用锁定对象实现字典时,您的主要关注点似乎是线程安全。看来,concurrentDictionary已经解决了这个问题。我认为重新发明轮子是没有意义的。

答案 2 :(得分:4)

仔细阅读ConcurrentDictionary。它有一些不明显的特征。

以下是其中一些:

  • 如果两个线程调用AddOrUpdate,则无法保证将调用哪个工厂代理,甚至不能保证工厂代表会生成某个项目,该项目将存储在字典中。< / LI>
  • GetEnumerator来电获得的调查员快照,可能会在枚举期间进行修改(不会导致任何例外情况)。
  • KeysValues属性是相应集合的快照,可能与实际字典状态不对应。

因此,请再次阅读ConcurrentDictionary并确定此行为是否符合您的要求。

希望这有帮助!

答案 3 :(得分:1)

我认为两者都将提供线程安全,但是使用带有lock对象的Dictionary会将可以同时访问Dictionary的线程数限制为1.使用Concurrent Dictionary时,可以指定并发级别(即可以使用的线程数)同时访问字典)。如果性能确实很重要,我相信Concurrent Dictionary应该是您的选择。