什么是操作上的std ::地图是线程安全的?
-
24-09-2019 - |
题
假设我有:
stl::map<std::string, Foo> myMap;
是以下功能线程安全?
myMap["xyz"] ?
即。我想有很多是线程之间共享这个巨大的只读地图;但我不知道如果连搜索是线程安全的。
一切都写入一次第一
然后在这之后,多个线程从中读取。
我试图避免锁定把这作为FAAST越好。 (亚亚可能过早优化我知道)
解决方案
在理论上没有STL容器是线程。在实践中读书是安全的,如果容器没有被同时修改。即标准不作任何线程的规格。该标准的下一个版本将和IIUC它就会保证安全只读行为。
如果你真的关心,使用数组排序与二进制搜索。
其他提示
C ++ 11要求所有成员函数声明为const
是线程安全为多个阅读器。
调用myMap["xyz"]
不是线程安全的,因为std::map::operator[]
没有作为const
声明。
调用myMap.at("xyz")
是线程安全的,虽然,作为std::map::at
被声明为const
。
至少在微软的落实,从容器中读取是线程安全的(的参考)。
然而,std::map::operator[]
可以修改数据和未声明const
。您应该改用std::map::find
,这是const
,获得const_iterator
并取消对它的引用。
理论上,只读数据的结构和功能不要求对线程安全的任何锁定。它本质上是线程安全的。有否数据竞争在并行存储器中读取。但是,你必须只有一个线程保证安全初始化。
作为最大S.指出的那样,大多的实施在图像myMap["xyz"]
读取元件将没有写操作。如果是这样,那么它是安全的。但是,再一次,你必须保证没有螺纹,其修改的结构,只是初始化阶段。
STL集合不是线程安全的,但它是相当简单的线程安全添加到一个。
您最好的选择是创建一个围绕问题的集合线程包装。
不隶属于 StackOverflow