我有两个主题:
std::map
std::map
由于std::map::erase
和std::map::insert
保持地图的所有迭代器都有效,我似乎不明白在这种情况下如何发生竞争条件。
答案 0 :(得分:2)
评论说得对。我将把它们与你的陈述结合起来:
std::map::erase
和std::map::insert
只有在顺序执行时才会使地图的所有迭代器都有效。
如果它们并行执行,则一个线程(当它开始工作时)可能面对部分修改的对象(另一个线程正在处理它)。对部分修改的对象的操作结果是未定义的。这是问题的根源。
如果您使用mutex
同步对对象的访问权限,则一切正常。容器没有内置同步,因为这会显着减慢他们的工作,而有时只需要这样做。