我正在开发一个多线程应用程序,每个线程将从一组地图和向量中读取(不会修改结构)。任何人都可以建议,因为线程只是从这些结构中读取,是否有必要在读取这些结构的代码块周围实现可共享的互斥锁?
答案 0 :(得分:15)
如果只读地图/矢量,则无需使用互斥锁。 vector和map已经回答了这个问题 虽然C ++ 03没有提到线程,但C ++ 11有条款覆盖你的问题。
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;