0
我有两个线程:threadsafety VS迭代器有效性
- 线程A插入到
std::map
- 线程B从
std::map
消除由于std::map::erase
和std::map::insert
保持地图有效的所有迭代器,我似乎无法理解在这种情况下可能发生的竞争状况。
我有两个线程:threadsafety VS迭代器有效性
std::map
std::map
消除由于std::map::erase
和std::map::insert
保持地图有效的所有迭代器,我似乎无法理解在这种情况下可能发生的竞争状况。
评论指出是正确的。我将它们与你的声明相结合:
std::map::erase
和std::map::insert
保持地图有效它们只能顺序执行的所有迭代器。
如果它们并行执行,则一个线程(当它开始工作时)可能会面对一个部分修改的对象(另一个线程正在处理它)。对部分修改的对象的操作结果未定义。这是问题的根源。
如果你同步访问你的对象与说mutex
一切都会正常工作。容器没有内置同步,因为这会显着减慢他们的工作,而这只是有时需要的。
地图的内部状态可能会在同时进行两次调用时混乱。想到“尺寸”。 – NathanOliver
由于只有最新的C++标准中的const函数才需要线程安全,并且std :: map不是线程安全的,为什么在调用非const函数时不会期望竞争条件? – UKMonkey