从多个线程遍历不变的字典是否安全?

本文关键字:字典 是否 安全 线程 遍历 | 更新日期: 2023-09-27 18:17:29

我有这样的代码,从多个线程同时执行(在Dictionary<int, double>类型的共享ab对象上):

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