【发布时间】:2012-05-07 09:42:50
【问题描述】:
对ConcurrentDictionary 的线程安全有疑问。从 API 中,我看到枚举器是线程安全的,但对于键和值属性,我看不到相同的。我的问题是:
当有其他线程同时修改它时,循环遍历 Keys 或 Values 集合是否安全?
【问题讨论】:
-
枚举器的行为与 Keys 和 Values 属性不同。虽然这些提供了字典的即时快照,但
GetEnumerator(也用于使用字典作为源的 LINQ 查询中)返回的内容包含在调用GetEnumerator之后对字典所做的修改。 -
ConcurrentDictionary 并不总是线程安全的 - blog.i3arnon.com/2018/01/16/concurrent-dictionary-tolist .
-
我在这里看到两个不同的活动:1 - 从字典中获取对集合的引用(它可能不是原子的),2 - 通过集合枚举。当有问题的线程试图检索集合以进行枚举时,其他线程是否可能会修改字典。
标签: c# .net multithreading