字典的线程安全性<TKey,TValue>

JMa*_*sch 22 c#

如果我初始化通用字典一次,并且不允许进一步添加/更新/删除,是否可以安全地从中读取多个线程而没有锁定(假设在启动读取器之前初始化字典)?

非泛型HashTable的帮助中有一条注释说它对多个读者来说是安全的,但我没有看到类似的不适用于通用字典

Eri*_*ert 42

为了您将来的参考,文档在这里:

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

它说:

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

  • 只是想确保我理解引用段落的"即使如此......"的一部分.这是否正确:(1)如果字典不再被修改(如OP的问题所述),那么枚举也不会成为问题.(2)如果将来可能修改字典,那么即使是`ConcurrentDictionary`枚举也"本质上不是线程安全的过程".正确? (2认同)
  • @RayLuo:一般来说,当枚举“正在运行”时,无论它是多线程还是单线程,都不允许修改集合。 (2认同)

Tho*_*que 17

是的,如果你不再修改字典,这是安全的.线程安全只是读/写方案中的一个问题

  • 但是,您必须考虑内部状态.在外部,您可能只是从字典中读取值.但是,您不知道在检索期间可能发生什么状态转换. (11认同)