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
同时读/写操作的不同对象确定
但是,如果要执行不同的操作,例如同时写入同一对象,则必须使用某种形式的自定义同步(例如,关键部分).