当字典可能调整大小时,我可以并行分配给字典吗?

Can I assign to a dictionary in parallel when that dictionary might resize?

基于此处的另一个答案:

这声称我无法并行分配给字典。我从来没有遇到过分配给集合并担心它会扩展自己的大小的问题。

如果我从那个答案延伸,我认为它说我不能做这个人为的例子:

Dictionary<int,int> foo = GetFoo();
var bar = new Dictionary<int,int>();

Parallel.ForEach(foo, bat=>
    {
        bar[bat.Key] = bat.Value
    }

这使得对字典的赋值并行进行,底层集合 bar 可能会根据需要自行调整大小。

这与 Jon skeet 的并行作业讨论中发生的事情非常相似: Parallel Linq - Use more threads than processors (for non-CPU bound tasks)

在我看来,在上述情况下我不需要使用 ConcurrentDictionary,但我链接的答案(来自我尊重的著名用户)表明并非如此。

按照我描述的方式使用 Dictionary 集合是否安全,还是会失败?

有人可以提供这种分配会失败的代码示例吗?我正在尝试识别 SLaks 和 Jon Skeet 的答案,他们都探索并行分配给 Dictionary

EDIT downvoter 可以解释我如何改进我的问题吗?如果我问的不清楚,请解释我如何澄清。谢谢。

您不能并行分配给字典,因为字典的写入 class 表明它不是线程安全的。关于原因的详细信息对讨论来说不是很重要。

如果您从静态字典中读取,您可以从多个线程中读取,因为 none 的读取选项会修改基础字典,但没有任何更新在多个线程中是安全的。

如果您想知道确切原因,请随意浏览 logic 并了解为什么并发更新可能会失败,但通常最好使用算法实现者的话,因为假设某人更安全else的逻辑是考虑并发写的,不支持。

多次写入失败的最简单示例是第 352/353 行(不是很明显)在该方法的热路径中,涉及复制一个值然后递增它。