c++ - 如果在此调用之前未创建 abcd,那么 `std::map<..> a; blah = a[abcd];` 线程安全吗?

标签 c++ multithreading stl dictionary std

所以我们创建了一张 map 。我们想要得到some_type blah = map_variable[some_not_inserted_yet_value]如果之前没有创建的话,这将调用添加新项目到 map 。所以我想知道 std::map 的 read 是否真的是线程安全的或者只能安全线程 try{ ...find(..)->second...

最佳答案

调用 find(...)->second 是线程安全的这一想法很大程度上取决于您对线程安全的看法。如果您只是意味着它不会崩溃,那么只要您在阅读字典的同时没有人修改字典,我想您就没事。

也就是说,事实上,无论您的最低线程安全要求是什么,调用 operator[] 方法本质上都是不是线程安全的,因为它可能会改变集合.

如果一个方法没有 const 重载,则意味着它可以改变对象,因此除非文档表明方法是线程安全的,否则该方法不太可能是线程安全的。

话又说回来,const 方法也可能不是线程安全的,因为您的对象可能依赖于非const 全局状态或具有可变 字段,因此如果您像使用非同步类一样使用非同步类,则需要非常非常小心。

关于c++ - 如果在此调用之前未创建 abcd,那么 `std::map<..> a; blah = a[abcd];` 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7199574/

相关文章:

c# - 将 dll 文件复制到 ClickOnce 部署中的 .exe 目录

c++ - static_assert 检查非模板类的模板构造函数中的值

multithreading - Kotlin中,一个线程一次只能运行一个协程?

javascript - 专业的Node库是如何实现异步执行的?

java - 如果我的程序中有多个线程,每个线程在技术上是否都有自己的堆栈?每个线程都有自己的堆吗?

C++缓冲池?

c++信号处理程序可以唤醒线程吗?

c++ - 在不使用任何 std::string 成员函数的情况下从 std::string 对象显式转换为 char*

c++ - 如何找到 key 大于 val 的映射的第一个元素

c++ - 从给定的 map 迭代器反向迭代