C# 从多个线程迭代一个不变的字典安全吗?
我有这样的代码,可以从多个线程同时执行(在C# 从多个线程迭代一个不变的字典安全吗?,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,我有这样的代码,可以从多个线程同时执行(在a和b类型Dictionary的对象上执行): 字典在线程的生命周期内不会更改。这安全吗?到目前为止,似乎还可以,但我想确定一下。来自: 只要不修改集合,词典可以同时支持多个读取器。即便如此,通过集合枚举本质上并不是线程安全的过程。在枚举与写访问争用的罕见情况下,必须在整个枚举期间锁定集合。要允许多个线程访问集合进行读写,必须实现自己的同步 只要您从未写过,它就应该是安全的。只有在您保证不会发生写操作的情况下 一个字典(TKey,TValue)可以支持多
a
和b
类型Dictionary
的对象上执行):
字典在线程的生命周期内不会更改。这安全吗?到目前为止,似乎还可以,但我想确定一下。来自:
只要不修改集合,词典可以同时支持多个读取器。即便如此,通过集合枚举本质上并不是线程安全的过程。在枚举与写访问争用的罕见情况下,必须在整个枚举期间锁定集合。要允许多个线程访问集合进行读写,必须实现自己的同步
只要您从未写过,它就应该是安全的。只有在您保证不会发生写操作的情况下
一个字典(TKey,TValue)可以支持多个阅读器
同时,只要集合未被修改。即便如此,
通过集合枚举本质上不是线程安全的
程序在枚举与写入争用的罕见情况下
访问时,必须在整个枚举期间锁定集合。
允许多个线程访问集合以进行读取
在编写时,您必须实现自己的同步
有关线程安全的替代方案,请参阅ConcurrentDictionary(TKey的,
TValue)
此类型的公共静态(在Visual Basic中共享)成员是线程
安全的
来源
a
和b
),其中a
和b
从不作为参数重复(所以我从不重复计算)。
foreach (var key in a.Keys.Union(b.Keys)) {
dist += Math.Pow(b[key] - a[key], 2);
}