线程安全与迭代器有效性

时间:2016-11-30 20:44:43

标签: c++ multithreading iterator race-condition stdmap

我有两个主题:

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

由于std::map::erasestd::map::insert保持地图的所有迭代器都有效,我似乎不明白在这种情况下如何发生竞争条件。

1 个答案:

答案 0 :(得分:2)

评论说得对。我将把它们与你的陈述结合起来:

std::map::erasestd::map::insert只有在顺序执行时才会使地图的所有迭代器都有效

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

如果您使用mutex同步对对象的访问权限,则一切正常。容器没有内置同步,因为这会显着减慢他们的工作,而有时只需要这样做。