【问题标题】:.NET Dictionary: is only enumerating thread safe?.NET 字典:仅枚举线程安全吗?
【发布时间】:2010-10-05 09:39:13
【问题描述】:

简单地从多个线程中枚举一个 .NET 字典是否安全?

根本不会修改字典。

【问题讨论】:

    标签: .net multithreading dictionary thread-safety


    【解决方案1】:

    是的……差不多吧:

    字典)>) 可以支持多个阅读器 同时,只要 集合未修改。即使是这样, 通过集合枚举是 本质上不是线程安全的 程序。在极少数情况下 枚举与写竞争 访问,集合必须是 在整个枚举期间锁定。 允许访问集合 通过多个线程进行阅读和 写,你必须实现你自己的 同步。

    (ref)

    【讨论】:

    • 这没有回答问题。引用的文本并不意味着纯阅读字典(如这里的情况)不是线程安全的,因此“几乎”具有误导性。
    • 该文档参考的第一句话回答了这个问题,但文档引用的最后两句话适用于“阅读和写作”。结合您模糊的“几乎”,使这个问题的答案令人困惑并最终产生误导。没有任何修改的读取是线程安全的。故事结局。你提供的大部分东西只会使水变得浑浊。
    【解决方案2】:

    是的,在这种情况下,枚举是线程安全的,因为在 foreach 循环开始时,会通过隐式调用 GetEnumerator 创建枚举器的新实例。

    【讨论】:

    • 虽然新的枚举数回调到同一个底层数组。虽然我不怀疑这对于只读来说也是一个问题。
    • 完全是凯文。这里的关键是当时没有写访问发生。一旦你写入哈希表,所有的赌注都结束了。
    猜你喜欢
    • 2010-10-12
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2020-12-30
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多