【问题标题】:Concurrency with const std::T's与 const std::T 的并发性
【发布时间】:2012-03-07 09:00:05
【问题描述】:

作为一个例子,考虑一个用 Splay 树实现的 std::map。这种树结构是可变的,每次访问地图进行读取时都会发生变化。当 map 为 const 时,谁必须保证并发读取的隔离,是用户代码还是 map 实现?

【问题讨论】:

  • 我不认为该标准对容器的并发性做出任何声明。
  • @OliCharlesworth:C++11 也是这样吗?
  • 这是这个问题的一种重复:stackoverflow.com/questions/1846186/…
  • @BjörnPollex:我不知道!我还活在 2003 年……
  • @Oli,确实如此,请参阅 C++11 23.2.2 容器数据竞赛

标签: c++ concurrency constants std


【解决方案1】:

提问者知道,如果您有写入集合的线程,用户必须管理同步锁定。

问题似乎是,如果同时线程只读取集合,标准是否可以保证线程安全。

我不确定旧的 C++ 标准是否对任何操作的线程安全有任何保证,但新的标准会保证(已在 cmets,23.2.2 中给出部分)。事实上,大多数供应商现在确实保证并发读取之间的线程安全,尽管集合中包含的对象内的并发显然需要由用户处理。

同样,您可以在 STL 集合上使用读写锁。

这些是堆栈溢出的相关问题:

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

Is the C++ std::set thread-safe?

【讨论】:

    【解决方案2】:

    阅读以下主题:

    你所问的似乎与我相似:

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

    【讨论】:

      【解决方案3】:

      std::* 不保证任何线程安全。

      【讨论】:

      • 实际上 C++11 的第 23.2.2 节定义了标准容器上的数据竞争保证。
      猜你喜欢
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多