【问题标题】:Are std::map and std::vector thread safe?std::map 和 std::vector 线程安全吗?
【发布时间】:2013-04-21 11:10:33
【问题描述】:

我正在开发一个多线程应用程序,每个线程将从一组映射和向量中读取(不会修改结构)。谁能告诉我,因为线程只从这些结构中读取,是否有必要在正在读取这些结构的代码块周围实现一个可共享的互斥锁?

【问题讨论】:

标签: c++ multithreading std stdvector stdmap


【解决方案1】:

在只读映射/向量的情况下,不需要使用互斥锁。 vectormap 已经回答了这个问题
虽然 C++03 没有提到线程,但 C++11 有条款覆盖你的问题。

23.2.2 容器数据竞争 [container.requirements.dataraces]

1 为避免数据竞争 (17.6.5.9),实现应考虑以下功能 常量:开始,结束,rbegin,撕裂,前,后,数据,查找,lower_bound,upper_bound,equal_range,在 并且,除了在关联或无序关联容器中,操作符[]。
2 尽管有(17.6.5.9),当包含的内容时,实现需要避免数据竞争 同一序列中不同元素中的对象,vector<bool> 除外,同时被修改。
3 [注:对于大小大于1的vector<int>x,可以执行x[1] = 5和*x.begin() = 10 在没有数据竞争的情况下同时执行,但 x[0] = 5 和 *x.begin() = 10 同时执行可能会导致 一场数据竞赛。作为一般规则的例外,对于向量 y,y[0] = true 可能与 y[1] 竞争 =真。 ——尾注]

因此在 C++11 中不仅允许读取对象,还允许同时修改其不同的对象(但不是容器!),但 vector

除外

【讨论】:

  • 其他班级成员呢?什么时候需要使用共享互斥锁?
  • @godzilla 一旦要修改容器,您将需要在读写时使用互斥锁。在不可变只读容器的情况下,它可以同时从不同的线程访问。
  • 其实我认为这个标准并没有给出任何保证。它当然不适用于 C++03,也许它适用于 C++11。但在这种情况下,没有一个理智的实现会是线程不安全的。
  • @KonradRudolph C++03 确实没有提到线程,通过 C++ 11 中的 23.2.2 Container data races 子句
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 2020-08-24
  • 2013-02-10
  • 2021-06-02
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多