2016-11-30 33 views
0

我有两个线程:threadsafety VS迭代器有效性

  • 线程A插入到std::map
  • 线程B从std::map

消除由于std::map::erasestd::map::insert保持地图有效的所有迭代器,我似乎无法理解在这种情况下可能发生的竞争状况。

+0

地图的内部状态可能会在同时进行两次调用时混乱。想到“尺寸”。 – NathanOliver

+0

由于只有最新的C++标准中的const函数才需要线程安全,并且std :: map不是线程安全的,为什么在调用非const函数时不会期望竞争条件? – UKMonkey

回答

2

评论指出是正确的。我将它们与你的声明相结合:

std::map::erasestd::map::insert保持地图有效它们只能顺序执行的所有迭代器。

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

如果你同步访问你的对象与说mutex一切都会正常工作。容器没有内置同步,因为这会显着减慢他们的工作,而这只是有时需要的。