std :: map中的线程安全性

piy*_*ush 0 c++ stl c++11

在多线程环境中使用没有锁定的std映射是否安全?保证两个线程永远不会在地图中操纵相同的条目.

已经存在一个问题,但我对多个线程访问地图中的不同条目的情况特别感兴趣.特别是无序的地图.

jua*_*nza 8

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

17.6.5.9数据竞争规避中,标准库保证const对容器的并发访问是安全的(至少在容器的范围内.如果元素允许通过const访问进行突变,则元素级别可能存在数据争用.)

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

只要有一个线程对容器或容器中的同一元素进行修改而其他线程读取或写入,您就会对竞争条件和未定义的行为持开放态度.


1除了 std::vector<bool>

  • "所有标准库容器"除了`vector <bool>`,虽然我猜你可以争辩说那个不算作容器;) (2认同)