6

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

4

1 回答 1

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 和,但在关联或无序关联容器,运算符 []。
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 > 除外

于 2013-04-21T11:12:50.497 回答