std :: map和std :: vector线程安全吗?

时间:2013-04-21 11:10:33

标签: c++ multithreading std stdvector stdmap

我正在开发一个多线程应用程序,每个线程将从一组地图和向量中读取(不会修改结构)。任何人都可以建议,因为线程只是从这些结构中读取,是否有必要在读取这些结构的代码块周围实现可共享的互斥锁?

1 个答案:

答案 0 :(得分:15)

如果只读地图/矢量,则无需使用互斥锁。 vectormap已经回答了这个问题 虽然C ++ 03没有提到线程,但C ++ 11有条款覆盖你的问题。

23.2.2集装箱数据竞赛[container.requirements.dataraces]

  

1为避免数据争用(17.6.5.9),实现应考虑以下功能   const:begin,end,rbegin,rend,front,back,data,find,lower_bound,upper_bound,equal_range,at   并且,除了在关联或无序的关联容器中,运算符[]。
  2尽管如此(17.6.5.9),仍需要实现以避免数据争用时所包含的内容   除了vector<bool>之外,同一序列中不同元素中的对象同时被修改   3 [注意:对于大小大于1的vector<int> x,可以执行x [1] = 5和* x.begin()= 10   同时没有数据争用,但同时执行x [0] = 5和* x.begin()= 10可能导致   数据竞赛。作为一般规则的例外,对于矢量&lt; bool&gt; y,y [0] = true可能与y竞争[1]   =真。 - 后注]

因此,在C ++ 11中,不仅允许读取对象,还允许并发修改其不同的对象(但不允许容器!),而vector&lt; bool&gt;