C 11 STL容器和线程安全

C++11 STL containers and thread safety

本文关键字:线程 安全 STL      更新时间:2023-10-16

我很难找到有关此的任何最新信息。

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个作家。:)