Threadsafety词典C#

时间:2012-02-15 04:55:09

标签: c# dictionary thread-safety

我的一位同事最近表示,如果您不介意转发陈旧数据,那么多个读写线程可以访问c#字典。他的理由是,由于该程序会从字典中读取,因此过时的数据不会成为问题。

我告诉他,当你有一个编写器线程时,总是需要锁定一个集合,因为集合的内部状态会被破坏。

我错了吗?

3 个答案:

答案 0 :(得分:8)

你是对的,你的同事是错的:只有在没有作家的情况下才能从多个线程访问字典。

.NET 4.0添加了ConcurrentDictionary<K,T>类,它正如其名称所暗示的那样。

答案 1 :(得分:1)

你是正确的,因为写入需要一些形式的锁定,尽管只是写一次并不意味着你必须lock() { }每次访问该集合。

正如您所说,内置集合的非同步版本是用于读取的线程安全的 。通常情况下,ReadWriterLockSlim用于在可能发生写入的情况下管理并发访问,因为只要没有进行写操作,它就允许多个线程访问集合,但只有一个线程(编写器)写。

答案 2 :(得分:1)

来自http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

只要不修改集合,字典就可以同时支持多个阅读器。即便如此,通过集合枚举本质上不是一个线程安全的过程。在枚举与写访问争用的极少数情况下,必须在整个枚举期间锁定该集合。要允许多个线程访问集合以进行读写,您必须实现自己的同步。

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