我无法找到任何有关此的最新信息。
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容器提供了以下基本的线程安全保证:
同时读取相同对象是可以的
同时读/写不同对象是可以的
就像其他人指出的那样,它们具有通常的“多读取器线程安全性”,但这甚至是 C++11 之前的情况。 Ofc 这并不意味着单个作者多个读者。这意味着 0 个作家。 :)