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>>
,并且每个线程都有十个线程,每个线程都写入向量的不同元素。
除此之外,如C64先生的答案所示,相同的规则与标准库的其余部分相同(请参阅17.6.5.9 [res.on.data.races])。.DATARACES]列出了一些可以安全地调用的容器的非CONST成员功能,因为它们仅返回对元素的非传统引用,它们实际上并没有修改任何内容(通常,任何非CONST成员函数都必须视为修改。)
我认为STL容器提供以下基本线程安全保证:
-
同时读取相同对象的是
-
不同>不同对象的同时读取/写入
但是,如果您想做不同的事情,例如同时写在同一对象上。
no。查看PPL或Intel TBB,以获取线程安全的STL样容器。
像其他人一样,他们通常具有"多个读取器线程安全性",但这甚至是C 11。OFC这并不意味着单个作者多个读者。这意味着0个作家。:)
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区