Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从多个线程迭代一个不变的字典安全吗?_C#_Multithreading_Thread Safety - Fatal编程技术网

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中共享)成员是线程 安全的

来源

那么这怎么是“不”呢?考虑到OP中的假设,这是肯定的“是”。我将修改标题-无论如何,里德击败我复制/粘贴。它被指定为“字典在线程的生命周期内不会更改”。虽然这个答案是正确的,但对于所讨论的案例,答案实际上是“是”。谁先发布与此无关(尽管人们确实倾向于先看答案再投票)只要答案是正确和完整的。有一点相关:如果字典没有变化,那么为什么要反复计算相同的事情呢?好的一点-我猜Cameron的线程是fire and forget worker线程。但这只是一个猜测。因此,也许他正在加载数据,然后调用一组worker线程来处理去掉它们,然后转到下一个数据点。@liho1eye:这一点很好,但我省略了一些上下文:我有大量(不变的)字典,我把它们中的某些对传递给一个函数(作为参数
a
b
),其中
a
b
从不作为参数重复(所以我从不重复计算)。
foreach (var key in a.Keys.Union(b.Keys)) {
    dist += Math.Pow(b[key] - a[key], 2);
}