c++ - 线程安全与迭代器有效性

标签 c++ multithreading iterator race-condition stdmap

我有两个线程:

  • 线程 A 插入 std::map
  • 线程 B 从 std::map 中移除

由于 std::map::erasestd::map::insert 保持 map 的所有迭代器有效,我似乎不明白如何在这种情况下可能会出现竞争条件。

最佳答案

评论说的是对的。我会将它们与您的陈述结合起来:

std::map::erasestd::map::insert保持 map 的所有迭代器有效只有当它们按顺序执行时。

如果它们并行执行,一个线程(当它开始工作时)可能会面对一个部分修改的对象(另一个线程正在处理它)。对部分修改的对象执行操作的结果是不确定的。这就是问题的根源。

如果您使用 mutex 同步对对象的访问,一切都会正常进行。容器没有内置同步,因为这会大大减慢它们的工作速度,而这只是有时需要。

关于c++ - 线程安全与迭代器有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40897854/

相关文章:

c++ - 如何理解 "abstract-declarator containing an ellipsis shall only be used in a parameter-declaration"

c# - 可以在 c#.net 控制台中暂停、缓存、刷新键盘输入吗?

java并发: CopyOnWriteArrayList strategy

java - EventQueue.isDispatchThread() 中的无限循环

c++ - 遍历并将数据插入标准 vector

java - 在 Android 上用 Java 或 C/C++ 解码 Airplay 数据包

c++ - 如何检查输入的长度? (C++)

c++ - 关于C++头文件的简单问题

c++ - std::string::iterator 偏移并返回

迭代器返回对其自身的引用