簡體   English   中英

std :: map從多個線程寫入/讀取

[英]std::map write/read from multiple threads

我希望能夠從多個線程讀取和寫入std :: map。 有沒有辦法在沒有互斥量的情況下做到這一點(可能使用std :: atomic)?

如果沒有,在C ++ 11中最簡單的方法是什么?

如果std::atomic<> ,你可以從任意線程修改和讀取它們 ,但你需要以某種方式保存它們的地址 - 指針,引用或迭代器 - 你需要知道沒有其他線程會打電話erase他們....

盡管如此,即使原子值也不會使修改容器(例如插入或擦除元素)變得安全,而其他線程也在進行修改,查找或迭代。 即使是“ const ”函數 - 如size()empty()begin()end()count()和迭代器移動 - 也是不安全的,因為變異操作可能正在重新布線節點之間鏈接或更新相同的數據。

對於上述以外的任何內容,您需要一個互斥鎖。


舉一個具體的例子,假設你已經插入了一個帶有std::string key "client_counter"的節點 - 你可以啟動一個線程來獲取該元素的迭代器並對該計數器進行原子更新,而其他線程可以find該元素和從中讀取但不得erase它。 您仍然可以在map插入其他節點以及其他更新程序和閱讀器,而無需與client_counter -updating線程進行任何額外同步。

如果您不想使用互斥鎖,那么您需要等待並發容器(C ++ 17?)。 如果你想在std::map使用std::atomic操作,那么你可能想在Internet上創建或發現並發原子std::map完全實現。

如果你想使用std::map std::atomic你可能需要知道這只會保護std::map元素,而不是std::map in self。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM