[英]C++11 STL containers and thread safety
我很难找到任何关于此的最新信息。
C++11 版本的 STL 容器是否有一定程度的线程安全保证?
由于性能原因,我确实希望它们不会。 但话又说回来,这就是为什么我们同时拥有std::vector::operator[]
和std::vector::at
。
由于现有的答案没有涵盖它(只有评论可以),我将仅提及当前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]列出了一些可以安全调用的容器的非常量成员函数,因为它们只返回对元素的非常量引用,它们实际上并没有修改任何东西(通常任何非常量成员函数都必须被视为修改。)
我认为 STL 容器提供以下基本的线程安全保证:
同时读取同一对象是可以的
不同对象的同时读/写是可以的
但是如果你想做一些不同的事情,比如在同一个对象上同时写入,你必须使用某种形式的自定义同步(例如临界区)。
否。查看 PPL 或 Intel TBB 以获取线程安全的 STL 类容器。
就像其他人指出的那样,他们通常具有“多读取器线程安全性”,但这甚至是 C++11 之前的内容。 Ofc 这并不意味着单个作者多个读者。 这意味着 0 个作者。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.