具有固定键的字典上的多线程

Ker*_*ren 5 c# multithreading dictionary

我有一个带有固定键集合的字典,我在程序开始时创建了它。后来,我有一些线程用值更新字典。

  • 一旦线程开始,就不会添加或删除对。
  • 每个线程都有自己的密钥。意思是,只有一个线程会访问某个 key
  • 线程可能会更新值

问题是,我应该锁定字典吗?

更新:

谢谢大家的解答

当我问这个问题时,我试图简化情况,只是为了理解字典的行为。

为了让自己清楚,这里是完整版本:我有一本包含约 3000 个条目(固定键)的字典,并且我有多个线程访问该键(共享资源),但我知道只有一个线程是一次访问一个关键条目。

那么,我应该锁定字典吗?并且 - 当您现在拥有完整版本时,字典是正确的选择吗?

谢谢!

Raj*_*ian 8

来自 MSDN

只要不修改集合,Dictionary 就可以同时支持多个阅读器。

要允许多个线程访问集合进行读写,您必须实现自己的同步。

有关线程安全的替代方案,请参阅 ConcurrentDictionary<TKey, TValue>.


ang*_*son 3

让我们一次一种解释地处理你的问题。

第一种解释:鉴于如何Dictionary<TKey, TValue>实现根据我给出的上下文,我是否需要锁定字典?

不,你不知道。

第二种解释:鉴于如何Dictionary<TKey, TValue记录根据我给出的上下文,我是否需要锁定字典?

是的,你绝对应该这样做。

在多线程世界中,无法保证今天可能正常的访问明天也正常,因为该类型被记录为非线程安全的。这允许程序员对类型的状态和完整性做出某些假设,否则他们必须为其构建保证。

.NET 的修补程序或更新或全新版本可能会更改实现并使其中断,这是您依赖未记录行为的错误。

第三种解释:根据我给出的上下文,字典是正确的选择吗?

不,不是。要么切换到线程安全类型,要么根本不使用字典。为什么不只为每个线程使用一个变量呢?

结论:如果您打算使用词典,请锁定词典。如果可以换做其他事情,那就去做吧。