1

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

4

3 回答 3

3

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

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

于 2013-10-16T15:30:41.753 回答
2

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

于 2013-10-16T15:37:00.270 回答
0

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

使用地图,修改的影响要有限得多——而不是潜在地移动向量的全部内容,修改只会影响地图中的单个节点。尽管如此,如果一个线程在另一个线程尝试读取该节点时删除了该节点,则会发生坏事,因此您仍然需要一个互斥锁来确保在任何给定时间只有一个线程在映射上运行。

于 2013-10-16T15:23:26.140 回答