[英]Can an std::map be moved while iterating through it?
当我遍历std::map
,是否有可能例如通过将元素添加到另一个线程中的map来删除其中的对象,从而导致迭代被破坏? (因为迭代器在移动时将指向一个不存在的变量)
理论上,当您将元素添加到std::map
,该std::map
中的所有迭代器都应保持有效。 但是问题在于操作不是原子的。 如果操作系统在操作过程中暂停插入线程并将控制权交还给迭代线程,则std::map
的状态可能无效。
您需要通过互斥或类似方式同步对地图的访问。 另外,您可以使用来自TBB或其他类似库的并发友好集合。 TBB提供了concurrent_unordered_map
和concurrent_hash_map
。
STL容器不是线程安全的。 完全没有保证。 因此,如果它们被不同的线程使用,则需要同步对任何标准容器的访问。
是的-如果另一个线程可能正在修改向量,则需要使用互斥体之类的东西来确保在任何给定时间只有一个线程可以访问该向量。
使用贴图时,修改的效果受到更大的限制-修改可能会影响贴图中的单个节点,而不是潜在地移动矢量的全部内容。 但是,如果一个线程在另一个线程试图读取该节点的同时删除该节点,则会发生不好的事情,因此您仍然需要一个互斥体来确保在给定的时间只有一个线程在该映射上进行操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.