我无法找到有关此信息的最新信息。
C ++ 11版本的STL容器是否保证了一定程度的线程安全性?
由于性能原因,我确实希望他们不这样做。但话说回来,这就是为什么我们同时拥有std::vector::operator[]
和std::vector::at
。
答案 0 :(得分:38)
由于现有的答案没有涵盖(只有评论),我只提及当前C++ standard specification的23.2.2 [container.requirements.dataraces],其中说:
除了vector<bool>
之外,同一序列中不同元素中包含的对象的内容被同时修改时,需要实现以避免数据争用。
即。访问同一容器的不同元素是安全的,例如,您可以拥有十个元素的全局std::vector<std::future<int>>
,并且有十个线程,每个线程都写入向量的不同元素。
除此之外,相同的规则适用于容器和标准库的其余部分(见17.6.5.9 [res.on.data.races]),如Mr.C64's answer所述,另外[容器。 requirements.dataraces]列出了一些可以安全调用的容器的非const成员函数,因为它们只返回对元素的非const引用,它们实际上并没有修改任何东西(通常任何非const成员函数都必须被认为是修改。)
答案 1 :(得分:25)
我认为STL容器提供以下基本的线程安全保证:
同一对象的同时读取
不同对象的同时读/写
但是如果你想做一些不同的事情,你必须使用某种形式的自定义同步(例如关键部分),例如同时写入同一个对象。
答案 2 :(得分:-7)
没有。查看PPL或Intel TBB以获取线程安全的STL类容器。
与其他人一样,他们已经注意到他们通常具有“多读者线程安全性”,但这甚至是C ++之前的版本11。 Ofc这并不意味着单个作家多个读者。这意味着0作家。 :)