C++ 11 STL容器和线程安全

Let*_*_Be 40 c++ multithreading stl c++11

我无法找到有关此信息的最新信息.

C++ 11版本的STL容器是否保证了一定程度的线程安全性?

由于性能原因,我确实希望他们不这样做.但话说回来,这就是为什么我们同时拥有std::vector::operator[]std::vector::at.

Jon*_*ely 38

由于现有的答案不包括它(只有注释),我只提到当前C++标准规范的 23.2.2 [container.requirements.dataraces],它说:

当同一序列中不同元素中包含的对象的内容vector<bool>同时修改时,需要实现以避免数据争用.

即访问同一容器的不同元素是安全的,例如,您可以拥有std::vector<std::future<int>>十个元素的全局,并且有十个线程,每个线程都写入向量的不同元素.

除此之外,同样的规则适用于容器和标准库的其余部分(见17.6.5.9 [res.on.data.races]),正如Mr.C64的答案所说,另外[container.requirements.dataraces]列出容器的一些非const成员函数,可以安全地被调用,因为他们只返回元素非const引用,它们实际上并不做任何修改(一般任何非const成员函数必须要考虑的修改.)


Mr.*_*C64 26

我认为STL容器提供以下基本的线程安全保证:

  • 同时读取的的同一个对象都OK

  • 同时读/写操作不同对象确定

但是,如果要执行不同的操作,例如同时写入同一对象,则必须使用某种形式的自定义同步(例如,关键部分).

  • 在这种情况下,"对象"的含义是什么?元素还是容器? (7认同)
  • @SteveJessop,`myvec [0] = 0`同时`myvec [1]`正常 - 顺序容器上的`operator []`必须避免竞赛([container.requirements.dataraces]/1).对于无序和关联容器,情况并非如此. (4认同)
  • @JonathanWakely,我的基础是n3337/23.2.2/1:"为避免数据争用(17.6.5.9),实现应将以下函数视为const:begin,end,[...]和,除了在关联或无序的关联容器中,operator []." (2认同)