47

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

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

由于性能原因,我确实希望他们不会。但是话又说回来,这就是我们同时拥有std::vector::operator[]和的原因std::vector::at

4

3 回答 3

44

由于现有的答案没有涵盖它(只有评论),我只提到当前C++ 标准规范的 23.2.2 [container.requirements.dataraces]说:

当同一序列中不同元素中包含的对象的内容vector<bool>被同时修改时,需要实现来避免数据竞争。

即访问同一容器的不同元素是安全的,例如,您可以拥有一个std::vector<std::future<int>>包含十个元素的全局元素,并拥有十个线程,每个线程都写入向量的不同元素。

除此之外,与标准库的其余部分相同的规则适用于容器(参见 17.6.5.9 [res.on.data.races]),正如C64 先生的回答所说,另外还有 [container.requirements.dataraces]列出了可以安全调用的容器的一些非常量成员函数,因为它们只返回对元素的非常量引用,它们实际上并不修改任何东西(通常任何非常量成员函数都必须被视为修改。)

于 2012-10-17T16:08:36.570 回答
28

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

  • 同时读取一个对象是可以的

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

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

于 2012-10-17T10:08:38.350 回答
-7

不可以。查看 PPL 或 Intel TBB 以了解线程安全的类似 STL 的容器。

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

于 2012-10-17T10:09:13.660 回答