繁体   English   中英

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

[英]Are std::map and std::vector thread safe?

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

在只读映射/矢量的情况下,无需使用互斥体。 向量地图都已经回答了
虽然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 [注意:对于大小大于1的vector<int> 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>例外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM