[英]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.