【问题标题】:When can I replace concurrent collection with standard collection?什么时候可以用标准收集代替并发收集?
【发布时间】:2013-03-12 08:18:19
【问题描述】:

当我有多个线程需要与一个集合同时工作时,我通常使用System.Collections.Concurrent 下的集合。
但是,与非并发对应物相比,这些集合更昂贵。我想知道在某些情况下是否可以安全地用非并发集合替换它们。

例如,假设我有一个字典,我首先用数据填充它,然后我生成了几个线程(或任务),这些线程(或任务)只从它读取,或者只检查一个键是否存在,但永远不要写或改变它。

在这种情况下,使用Dictionary<TKey, TValue> 是否安全,还是必须使用ConcurrentDictionary<TKey, TValue>

在一般情况下,只要不修改集合,我是否可以假设所有标准集合都支持多个阅读器?

【问题讨论】:

    标签: .net .net-4.0 concurrency


    【解决方案1】:

    例如,假设我有一个字典,我首先用数据填充它,然后我生成了几个线程(或任务),它们只从它读取,或者只检查一个键是否存在,但从不写入或更改它.

    是的,从多个线程读取Dictionary<,> 是安全的,只要没有 写入者。您应该确保在最后一次写入和第一次读取之间存在内存屏障 - 但如果您在填充字典之后生成线程,那应该不是问题。

    来自documentation

    只要不修改集合,Dictionary<TKey, TValue> 可以同时支持多个读取器。

    【讨论】:

    • 是不是所有集合的通用规则,只要不修改集合就可以有多个并发读者?或者这是Dictionary<TKey, TValue>的特殊属性?
    • @AmirGonnen:至少很常见。值得一试,但 .NET 中最常见的集合具有该属性。
    • 好的,我们以HashSet<T> 为例。文档对此只字未提。假设它像Dictionary<TKey, TValue> 一样工作并且允许并发读者是否有意义?
    • @AmirGonnen:是的,我认为这是一个合理的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多