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

问题描述 投票:0回答:3

我无法找到任何有关此的最新信息。

C++11 版本的 STL 容器是否有一定程度的线程安全保证?

由于性能原因,我确实希望他们不会。但话说回来,这就是为什么我们同时拥有

std::vector::operator[]
std::vector::at

c++ multithreading stl c++11
3个回答
50
投票

由于现有的答案没有涵盖它(只有评论),我只会提到当前 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]列出了容器的一些非常量成员函数,这些函数可以安全地调用,因为它们只返回对元素的非常量引用,它们实际上不会修改任何内容(通常任何非常量成员函数都必须被视为修改。 )


32
投票

我认为STL容器提供了以下基本的线程安全保证:

  • 同时读取相同对象是可以的

  • 同时读/写不同对象是可以的

但是如果您想做一些不同的事情,例如,您必须使用某种形式的自定义同步(例如关键部分)同时写入同一对象。


-6
投票
不。查看 PPL 或 Intel TBB 以获取线程安全的类 STL 容器。

就像其他人指出的那样,它们具有通常的“多读取器线程安全性”,但这甚至是 C++11 之前的情况。 Ofc 这并不意味着单个作者多个读者。这意味着 0 个作家。 :)

© www.soinside.com 2019 - 2024. All rights reserved.