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