繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM