什么操作在std :: map上是线程安全的?

ano*_*non 14 c++ multithreading dictionary std c++-standard-library

假设我有:

stl::map<std::string, Foo> myMap;
Run Code Online (Sandbox Code Playgroud)

以下函数线程安全吗?

myMap["xyz"] ?
Run Code Online (Sandbox Code Playgroud)

即我想拥有许多线程共享的巨型只读映射; 但我不知道即使搜索也是线程安全的.


一切都是先写的.

然后,从中读取多个线程.

我正试图避免锁定,使其成为尽可能多的事情.(yaya可能过早优化我知道)

dal*_*lle 12

C++ 11要求声明的所有成员函数const对多个读者都是线程安全的.

调用myMap["xyz"]不是线程安全的,因为std::map::operator[]未声明为const.myMap.at("xyz")但是,调用是线程安全的,如std::map::at声明的那样const.


ton*_*ony 11

理论上,没有STL容器是线程安全的.实际上,如果不同时修改容器,则读取是安全的.即标准没有规定线程.标准的下一个版本将和IIUC一起保证安全的只读行为.

如果您真的担心,请使用带二进制搜索的排序数组.


Max*_*keh 6

至少在Microsoft的实现中,从容器读取是线程安全的(引用).

但是,std::map::operator[]可以修改数据并且不会声明const.您应该使用std::map::find,即const获取const_iterator和取消引用它.