在c#中的Parallel.ForEach中的r/w字典条目是否安全?

Ham*_*med 2 c# multithreading dictionary concurrentdictionary parallel.foreach

我有一个字典,我想在foreach循环中修改它的值,但是,因为我的应用程序是时间关键的,我试图避免所有不必要的锁定开销.

var loopData = new Dictionary<int, List<string>>();
var results = new Dictionary<int, List<string>>();

/// loopData and results are both initialized
/// with same set of keys.

Parallel.ForEach(loopData, data =>
    {
        var list = data.Value;
        /// manipulate list here

        /// Is this safe?
        results[data.Key] = list;
    });
Run Code Online (Sandbox Code Playgroud)

标记命令是否安全?即,无需锁定即可读/写字典的不同键值对.

注1:我知道并发集合名称空间及其所有宏观集合.另外我知道我可以简单地lock使用突出显示的命令来确保它的安全性.如前所述,我的目标是尽可能避免不必要的开销.

注2:在此链接中提出了类似的问题.在该问题中,容器的项目在Parallel.ForEach循环内被修改.然而,这里我们没有修改键值对,因此容器是完整的,只有被指向的数据被改变.这使得它与上述问题不同.

更新

  1. 这段代码没有锁定可以正常工作,但我必须确定.
  2. 虽然这ConcurrentDictionary会增加最少的开销,但我想避免它,如果这是安全的.

Sco*_*ain 10

同时从字典中读取是安全的,但同时写入并同时写入它并不安全.ConcurrentDictionary将是您同时插入的最快选项.