假设我有:

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集合不是线程安全的,但它是相当简单的线程安全添加到一个。

您最好的选择是创建一个围绕问题的集合线程包装。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top