.NET字典:只有枚举是线程安全的吗?

5

在多个线程中简单地枚举.NET字典是否安全?

完全没有对字典的修改。

2个回答

11

是的,在这种情况下枚举是线程安全的,因为在 foreach 循环开始时,使用隐式调用 GetEnumerator 创建一个新的枚举器实例。


虽然新枚举器会回调到同一个基础数组中,但我不认为这会对只读造成问题。 - Kevin
凯文说得对。关键在于此时没有写入访问。一旦你向哈希表中写入,所有的赌注都会失效。 - Konrad Rudolph

9

是的...差不多:

一个字典<(Of <(TKey, TValue>)>)可以支持多个读者并发访问,只要集合没有被修改。即便如此,枚举整个集合本质上是不安全的线程操作。在罕见的情况下,如果枚举与写访问发生冲突,则必须在整个枚举期间锁定集合。为了允许多个线程同时对集合进行读写访问,必须实现自己的同步机制。

(参考链接)


2
这并没有回答问题。引用的文本并没有暗示纯读取字典(在这种情况下)不是线程安全的,因此“几乎”是误导性的。 - mafu
2
那份文档中的第一句话回答了问题,但引用的最后两句话适用于“读写”。再加上您含糊的“差不多”回答让人困惑,最终会导致对所提出的问题给出误导性的答案。不做任何修改的读取是线程安全的。这就是全部。你提供的大部分内容只会让事情更加混乱。 - DanO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接