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

新手上路,请多包涵

假设我有:

 stl::map<std::string, Foo> myMap;

以下函数线程安全吗?

 myMap["xyz"] ?

即我想拥有这个在许多线程之间共享的巨大只读映射;但我不知道即使搜索它是否是线程安全的。


一切都先写入一次。

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

我试图避免锁定以使其尽可能快。 (我知道,yaya 可能过早优化)

原文由 anon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.4k
2 个回答

理论上没有 STL 容器是线程安全的。在实践中,如果容器没有被同时修改,读取是安全的。即该标准没有关于螺纹的规范。该标准的下一个版本将和 IIUC 将保证安全的只读行为。

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

原文由 tony 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

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

原文由 dalle 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题