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

god*_*lla 6 c++ multithreading stdmap std stdvector

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

ale*_*der 15

在只读地图/矢量的情况下,不需要使用互斥锁.这已经解决了向量映射
虽然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和,除了关联或无序关联容器,operator [].
2尽管如此(17.6.5.9),除了vector<bool>同时修改同一序列中不同元素中包含对象的内容时,还需要实现以避免数据争用.
3 [注意:对于vector<int>大小大于1的x,x [1] = 5且*x.begin()= 10可以在没有数据争用的情况下同时执行,但x [0] = 5和*x.begin同时执行的()= 10可能导致数据竞争.作为一般规则的例外,对于向量<bool> y,y [0] = true可以与y [1] = true竞争. - 尾注]

因此,在C++ 11中,不仅允许读取对象,还允许并发修改其不同的对象(但不允许容器!),vector <bool>除外