c++ - std::map 中的线程安全

标签 c++ c++11 stl

在多线程环境下不加锁使用std map安全吗? 保证两个线程永远不会操作映射中的相同条目。

关于这个已经有一个问题,但我对多个线程访问映射中不同条目的情况特别感兴趣。特别是无序 map 。

最佳答案

只要没有线程在修改 map ,它就是安全的。如果线程修改映射的不同元素也是安全的(前提是元素本身不会通过例如修改某些全局状态导致竞争条件):

17.6.5.9 避免数据竞争中,标准库保证并发 const对容器的访问是安全的(至少就容器而言是这样。如果元素允许通过 const 访问进行突变,则元素级别可能存在数据竞争。)

23.2.2 容器数据竞争中进一步保证:如果修改/读取容器的不同元素,非常量并发访问是安全的1

一旦您有一个线程对容器或容器中的同一元素进行修改,而其他线程正在读取或写入,您就会面临竞争条件和未定义的行为。


1 除了 std::vector<bool>

关于c++ - std::map 中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29226578/

相关文章:

c++ - boost::assign 与 std::map

c++ - 内存使用率上升。释放的内存未被重用

c++ - SendInput 鼠标时间

c++ - c++什么时候需要用#include

c++ - 返回 std::pair 时会发生 RVO 吗?

c++ - 在将参数传递给基类时使用 std::move()

c++ - 为数值数组创建别名

c++ - std::map<tstring<std::map<tstring, unsigned int>> 赋值失败

c++ - 我们可以安全地依赖迭代器 v.end() 的位置吗?

c++ - C++ STL中的set和hashset有什么区别?