我有一個std ::地圖(或std :: unordered_map,因爲我認爲他們的行爲類似),我讀出和寫入。我也有一個關聯的互斥體。閱讀安全:: unordered_map
我將在地圖上閱讀和寫作(通過插入或刪除元素)。我聽說STL容器是安全的。如果是這樣,只使用互斥鎖進行寫操作是安全的?
我這麼問是因爲我需要在一個點到地圖的價值迭代,我想,當一個元素需要修改只能用我的互斥。
我有一個std ::地圖(或std :: unordered_map,因爲我認爲他們的行爲類似),我讀出和寫入。我也有一個關聯的互斥體。閱讀安全:: unordered_map
我將在地圖上閱讀和寫作(通過插入或刪除元素)。我聽說STL容器是安全的。如果是這樣,只使用互斥鎖進行寫操作是安全的?
我這麼問是因爲我需要在一個點到地圖的價值迭代,我想,當一個元素需要修改只能用我的互斥。
它是安全的,僅用於寫入操作的互斥?
您需要確保在寫入地圖時不要嘗試從地圖讀取數據。所以你不需要鎖定一個互斥量,而只有讀取正在發生,但是如果有任何線程可以寫入,那麼所有線程(甚至是讀取器)都需要使用互斥鎖。
一般來說,沒有。讀者和作者都必須獲得互斥體。
否則,當有併發讀取和寫入,這會導致不確定的行爲,你的風險數據競爭。在實踐中,可能會導致崩潰,或讀者可能會損壞您從未放入地圖的數據。即使它看起來有效,它也會混淆像賽車探測器這樣的有用工具(例如,thread sanitizer,Helgrind)。它也使你的代碼可能不可移植。只有
如果你能證明沒有更多的作家地圖,和改變是對所有其他線程可見,情況發生了改變,現在所有的訪問都是讀者。此時,不能有任何數據競爭,並且可以安全地從地圖中讀取而不進行任何同步。
如果仍然有更新的可能性,您可以使用並行數據結構來避免鎖定。 C++ 11(和C++ 17)不提供,但有非標準的實現可用。在英特爾線程構建
所以,如果你真的需要的性能,你可以看看這些併發的哈希表的實現(否則只是結合使用std::unordered_map
與互斥所有訪問)模塊(TBB)
std::unorder_map
,但不支持併發的刪除操作)