【问题标题】:Is it safe to read a single c++ std::map object by different threads simultaneously without synchronization mechanisms?在没有同步机制的情况下同时由不同线程读取单个 c++ std::map 对象是否安全?
【发布时间】:2010-09-27 02:52:09
【问题描述】:

我有一个全局对象,其中包含多个 c++ std::map 对象。该对象应该在多线程环境中只读。但是我不确定在 std::map 的实现中读取 C++ std::map 对象时是否有任何写操作。 IDE 是 Visual Studio 2008。我应该为读取操作提供一些同步机制吗?

【问题讨论】:

    标签: c++ multithreading visual-studio-2008 stdmap


    【解决方案1】:

    是的,只要没有人写入地图,这将是可以的。详情请参见此处。

    Thread safety of std::map for read-only operations

    【讨论】:

    • @Tony:您能否更具体地说明其他答案有什么问题?
    • @Eugen:登录说“具体实施的问题”,你“检查......你的......实施”,乔希“可能......不安全”。那是FUD。当然,您需要确保在最后一次更新之后进行一些同步,但在此之后,任何 STL 容器的并发读取是 - 正如史蒂夫所说 - 安全。
    • @Tony 有一段时间,有几个 std::string 的实现不是线程安全的,因为它们以非线程安全的方式使用 COW。你真的确实需要检查你的实现,就 C++ 标准而言,在 C++0x 线程甚至没有被想象之前。
    • @Logan:很好的历史反例:-)。所以,Steve 关于std::map 的说法是对的,但我将其推广到所有STL 容器是错误的……VC++6 和GCCsgi.com/tech/stl/thread_safety.html - 因此对 std::string 的修复是不公平的?在线程方面,标准中没有规定,但长期以来对环境的合理期望已经很好地理解了。
    【解决方案2】:

    至少存在一个“便携”问题,如果您使用operator[] 读取,则不一定是只读操作,如果地图中尚不存在该项目,它将被创建。除此之外,它成为具体实施的问题。

    【讨论】:

    • "operator[]" 是我正在使用的。我会解决的。
    • 是的。我的代码中有这个,但很快就使用 find() 和 const_insterator 更改为 const 方法。
    【解决方案3】:

    如果您使用下标运算符,则不。下标运算符 (map[1]) 有可能会改变地图的结构。

    但是,如果您使用带有 const_iterators 的 find 方法,它是合理的安全的。请记住,如果地图被更改,所有这些迭代器都可能变得无效。

    话虽如此,这仍然可能是一个不安全的想法。

    【讨论】:

      【解决方案4】:

      有关 VC++ 2008 附带的 std 库的详细信息,请参阅 here

      单个对象是线程安全的 从多个线程读取。为了 例如,给定一个对象 A,它是安全的 从线程 1 和从 同时线程 2。

      没有关于标准容器线程安全的规则,这取决于库开发人员。因此,请务必检查您的特定 std 实现的文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-13
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 2017-05-15
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多