我有两个线程:
- 线程 A 插入
std::map
- 线程 B 从
std::map
中移除
由于 std::map::erase
和 std::map::insert
保持 map 的所有迭代器有效,我似乎不明白如何在这种情况下可能会出现竞争条件。
最佳答案
评论说的是对的。我会将它们与您的陈述结合起来:
std::map::erase
和 std::map::insert
保持 map 的所有迭代器有效只有当它们按顺序执行时。
如果它们并行执行,一个线程(当它开始工作时)可能会面对一个部分修改的对象(另一个线程正在处理它)。对部分修改的对象执行操作的结果是不确定的。这就是问题的根源。
如果您使用 mutex
同步对对象的访问,一切都会正常进行。容器没有内置同步,因为这会大大减慢它们的工作速度,而这只是有时需要。
关于c++ - 线程安全与迭代器有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40897854/