Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::map上的哪些操作是线程安全的?_C++_Multithreading_Dictionary_Std_C++ Standard Library - Fatal编程技术网

C++ std::map上的哪些操作是线程安全的?

C++ std::map上的哪些操作是线程安全的?,c++,multithreading,dictionary,std,c++-standard-library,C++,Multithreading,Dictionary,Std,C++ Standard Library,假设我有: stl::map<std::string, Foo> myMap; 也就是说,我想要这个巨大的只读地图,它可以在多个线程之间共享;但我不知道搜索它是否是线程安全的 一切都先写一次 然后,多个线程从中读取 我正试图避免锁,以使这尽可能快。(我知道可能是过早的优化)STL集合不是线程安全的,但将线程安全添加到集合中相当简单 您最好的选择是围绕所讨论的集合创建一个线程安全的包装。理论上没有STL容器是线程安全的。实际上,如果容器没有被同时修改,那么读取是安全的。该标准对螺纹

假设我有:

stl::map<std::string, Foo> myMap;
也就是说,我想要这个巨大的只读地图,它可以在多个线程之间共享;但我不知道搜索它是否是线程安全的


一切都先写一次

然后,多个线程从中读取


我正试图避免锁,以使这尽可能快。(我知道可能是过早的优化)

STL集合不是线程安全的,但将线程安全添加到集合中相当简单


您最好的选择是围绕所讨论的集合创建一个线程安全的包装。

理论上没有STL容器是线程安全的。实际上,如果容器没有被同时修改,那么读取是安全的。该标准对螺纹没有规定。标准的下一个版本将和IIUC it将保证安全的只读行为


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

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


但是,
std::map::operator[]
可以修改数据,并且不会声明为
const
。相反,您应该使用
std::map::find
,即
const
,来获取
const\u迭代器并解除对它的引用。

理论上,只读数据结构和函数不需要任何线程安全锁。它本质上是线程安全的。并发内存读取上没有数据竞争。但是,必须保证仅通过单个线程进行安全初始化


正如Max S.所指出的,在大多数情况下,像
myMap[“xyz”]
这样读取map中元素的实现都没有写操作。如果是这样,那么它是安全的。但是,您必须再次保证,除了初始化阶段外,没有线程修改结构。

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

调用
myMap[“xyz”]
不是线程安全的,因为
std::map::operator[]
未声明为
const

调用
myMap.at(“xyz”)
是线程安全的,因为
std::map::at
声明为
const

为了使容器中有任何内容,需要将其写入。因此,线程安全问题……这些问题指定我们正在查看只读映射。我假设这意味着在从多个线程读取之前,它在一个线程中被完全填充。
myMap["xyz"] ?