C#Dictionary <t,k>单作者多读者的线程安全性</t,k>

时间:2015-02-11 13:20:23

标签: c# .net dictionary base-class-library

  

字典可以同时支持多个读者,   只要集合没有被修改。即便如此,列举   通过集合本质上不是一个线程安全的过程。在   枚举与写访问争用的罕见情况   必须在整个枚举期间锁定集合。允许的   多个线程可以访问的集合,用于读写   你必须实现自己的同步。

这就是MSDN所说的。

如果没有必要,我不想使用ConcurrentDictionary

我假设,如果只有一个线程在Dictionary<T,K>上执行编写器操作,则其他线程可以安全地同时执行简单的读取操作(如TryGetValue而不是枚举)而无需获取锁,我是对的吗?

2 个答案:

答案 0 :(得分:5)

  

我假设,如果只有一个线程执行编写器操作   字典,其他线程执行简单是安全的   同时读取操作(如TryGetValue不枚举)   没有获得锁定

没有。你的假设是错误的。只有当没有作者修改字典时才安全,而不是当你有一个作家时。

ReaderWriterLockSlim完全是为在这种情况下使用而设计的。这就是说我只使用ConcurrentDictionary代替重新发明轮子

答案 1 :(得分:1)

旧的System.Collections.Hashtable对于多读者单作者场景是安全的,也就是说,任何数量的线程都可以从Hashtable中读取,但最多只有一个线程可以同时修改它。 (作者线程可以在读者阅读时安全地修改Hashtable)。

通用Dictionary<T,K>对于此类情况并不安全 - 请改用ConcurrentDictionary<T,K>

请注意,System.Collections.HashtableConcurrentDictionary<T,K>使用完全不同的实现并提供不同的API。 ConcurrentDictionary<T,K>非常适合延迟初始化和读取缓存等场景。 System.Collections.Hashtable性能更高,因为它是一种无锁数据结构,而ConcurrentDictionary<T,K>使用封装到Windows API的线程同步。