线程安全与迭代器有效性
threadsafety vs Iterator validity
我有两个线程:
- 线程 A 插入
std::map
- 线程 B 从
std::map
中移除
由于 std::map::erase
和 std::map::insert
保持映射的所有迭代器有效,我似乎不明白在这种情况下如何出现竞争条件。
评论说的是对的。我会将它们与您的陈述结合起来:
std::map::erase
and std::map::insert
保持映射的所有迭代器有效 仅当它们按顺序执行时。
如果它们并行执行,一个线程(当它开始工作时)可能会面对一个部分修改的对象(另一个线程正在处理它)。对部分修改的对象执行操作的结果是不确定的。这就是问题的根源。
如果您使用 mutex
同步对对象的访问,一切都会正常进行。容器没有内置同步,因为这会显着降低它们的工作速度,而这只是有时需要。
我有两个线程:
- 线程 A 插入
std::map
- 线程 B 从
std::map
中移除
由于 std::map::erase
和 std::map::insert
保持映射的所有迭代器有效,我似乎不明白在这种情况下如何出现竞争条件。
评论说的是对的。我会将它们与您的陈述结合起来:
std::map::erase
and std::map::insert
保持映射的所有迭代器有效 仅当它们按顺序执行时。
如果它们并行执行,一个线程(当它开始工作时)可能会面对一个部分修改的对象(另一个线程正在处理它)。对部分修改的对象执行操作的结果是不确定的。这就是问题的根源。
如果您使用 mutex
同步对对象的访问,一切都会正常进行。容器没有内置同步,因为这会显着降低它们的工作速度,而这只是有时需要。