从多个线程遍历不变的字典是否安全?
本文关键字:字典 是否 安全 线程 遍历 | 更新日期: 2023-09-27 18:17:29
我有这样的代码,从多个线程同时执行(在Dictionary<int, double>
类型的共享a
和b
对象上):
foreach (var key in a.Keys.Union(b.Keys)) {
dist += Math.Pow(b[key] - a[key], 2);
}
字典在线程的生命周期内不会改变。这安全吗?到目前为止,似乎还可以,但我想确定一下。
来自字典文档:
只要不修改集合,Dictionary可以同时支持多个reader。即便如此,在集合中枚举本质上也不是线程安全的过程。在枚举与写访问竞争的极少数情况下,必须在整个枚举期间锁定集合。要允许多个线程访问集合进行读写,必须实现自己的同步。
只要你不写,它应该是安全的
仅当您保证不发生写操作
来源一个字典(Of TKey, TValue)可以支持多个读取器并发地,只要集合未被修改。即便如此,在集合中枚举本质上不是线程安全的过程。在极少数情况下,枚举与write争用访问时,必须在整个枚举期间锁定集合。允许多个线程访问集合以进行读取和写,你必须实现你自己的同步。
有关线程安全的替代方法,请参见ConcurrentDictionary(Of TKey,TValue)。
Public static(在Visual Basic中共享)这种类型的成员是thread安全。
- http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
- http://msdn.microsoft.com/en-us/library/dd287191.aspx