首页 > 解决方案 > 为什么并行访问和更改 System.Collections.Generic.Dictionary 不会导致异常/崩溃?

问题描述

有人可以解释或指出一些可以向我解释为什么此代码不会引发任何异常的文档:

var d = new Dictionary<object, object>();
System.Threading.Tasks.Parallel.ForEach(new Action[] {
    () => {
        System.Threading.Tasks.Parallel.For(0, 1024, i => {
            d.Add(new object(), new object());
        });
    },
    () => {
        System.Threading.Tasks.Parallel.For(0, 1024, i => {
            d.TryGetValue(new object(), out _);
        });
    },
}, a => a());

我尝试在我的 8 核计算机上运行它,期望某些东西会引发有关无效操作或空引用等的异常,但它永远不会。虽然我最终得到了一个元素数量错误的字典,但它如何不会抛出异常和/或崩溃?

标签: c#thread-safetyclrrace-condition

解决方案


仅仅因为某些东西不是线程安全的并不意味着从多个线程中使用它会导致它抛出异常。Dictionary<TKey, TValue> 类不是线程安全的,一次只能被一个线程使用。它可能不包括对哪些线程同时访问它的任何检查,因为这太昂贵了。它只是假设一次只有一个线程访问它。


推荐阅读