可以在迭代它时移动std :: map吗?

时间:2013-10-16 15:21:59

标签: c++ iterator thread-safety stdmap

当我迭代std::map时,是否有可能通过例如在另一个线程中向地图添加元素,其中的对象将被删除导致迭代损坏? (因为迭代器将在移动时指向一个不存在的变量)

3 个答案:

答案 0 :(得分:3)

理论上,当您向std::map添加元素时,该映射中的所有迭代器都应保持有效。但问题是操作不是原子的。如果操作系统在操作过程中挂起插入线程并将控制权交还给迭代线程,则std::map的状态可能无效。

您需要通过互斥或类似的方式同步对地图的访问。或者,您可以使用TBB或其他类似库中的并发友好集合。 TBB提供concurrent_unordered_mapconcurrent_hash_map

答案 1 :(得分:2)

STL容器不是线程安全的。根本没有保证。因此,如果不同的线程使用它们,则需要同步对任何标准容器的访问。

答案 2 :(得分:0)

是 - 如果另一个线程可能正在修改向量,则需要使用类似互斥的东西来确保在任何给定时间只有一个线程可以访问该向量。

使用地图,修改的效果更加有限 - 而不是可能移动矢量的整个内容,修改仅影响地图中的单个节点。尽管如此,如果一个线程正在删除某个节点,就像另一个线程正在尝试读取该节点一样,那么就会发生不好的事情,因此您仍然需要一个互斥锁来确保在任何给定时间只有一个线程在地图上运行。