Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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_Dictionary_Locking - Fatal编程技术网

C# 我使用字典需要锁定吗?

C# 我使用字典需要锁定吗?,c#,multithreading,dictionary,locking,C#,Multithreading,Dictionary,Locking,许多线程都可以访问摘要。每个线程都有一个访问字典的唯一密钥 Dictionary<string, List<Result>> summary; 词典摘要; 以下操作是否需要锁定 summary[key]=新列表() summary[key].Add(新结果()) 似乎我不需要锁定,因为每个线程将使用不同的键访问字典,但是(1)是否会因为使用其他踏板同时向字典添加新记录而出现问题?是的,您需要使用锁定 对于添加操作,字典不是线程安全的。 如果你在.NET 4上,你可以考

许多线程都可以访问
摘要
。每个线程都有一个访问字典的唯一密钥

Dictionary<string, List<Result>> summary;
词典摘要;
以下操作是否需要锁定

  • summary[key]=新列表()
  • summary[key].Add(新结果())

  • 似乎我不需要锁定,因为每个线程将使用不同的键访问字典,但是(1)是否会因为使用其他踏板同时向字典添加新记录而出现问题?

    是的,您需要使用锁定

    对于添加操作,字典不是线程安全的。 如果你在.NET 4上,你可以考虑切换到。否则,您应该创建自己的线程安全集合(例如)


    考虑使用同步对集合的访问(以防不使用ConcurrentDictionary)。

    必须锁定对词典的所有写入访问。无法保证访问不同的密钥是线程安全的,事实上并非如此

    发件人:

    只要不修改集合,词典可以同时支持多个读取器。即便如此,通过集合枚举本质上并不是线程安全的过程。在枚举与写访问争用的罕见情况下,必须在整个枚举期间锁定集合。要允许多个线程访问集合进行读写,必须实现自己的同步


    默认情况下,字典不是线程安全的。你要补充什么并不重要。最重要的是:您无法控制来自不同线程的并发添加。所以你肯定需要锁。或者切换到线程安全集合(即.NET 4+的CocnurrentDictionary)

    或者可以将字典作为一个整体进行修改(即,它用来保存数据的任何数据结构),因此需要锁定。例如,在哈希表中,键可能会发生冲突;在一棵树中,两者都可能尝试旋转同一子树。瞧,是的,除非所讨论的字典特别支持并发访问,否则您需要锁定。@Jerry,您的“注释”与答案有什么区别?@KirkWoll:我对.NET如何定义其字典类缺乏确定性。还有一个事实是,它足够短,可以放在评论中。:-)+1、
    readerwriterlocksim
    非常好用,也可以在.NET 3.5中找到。@the coon,对不起,我忘了问:我现在使用
    ConcurrentDictionary
    ,但我是否还需要将
    列表
    替换为
    BlockingColleciton
    并使用
    ConcurrentDictionary
    ?不,如果你没有在应用程序的其他地方保留对列表的引用。如果您通过字典(例如dict[key].Add(someValue))读/写列表,那么它是安全的,因为字典将确保线程安全地访问列表。@coon,您的意思是如果我这样使用它:
    var list=new list;var dic=new ConcurrentDictionary();dic[key]=列表;
    ,所以我确实需要
    阻止Colleciton
    而不是
    列表
    ,对吗?您可以直接执行dic[key]=new list(),并且不需要锁定列表。因此您可以继续使用列表。