2016-08-25 71 views
1

我有一個std ::地圖(或std :: unordered_map,因爲我認爲他們的行爲類似),我讀出和寫入。我也有一個關聯的互斥體。閱讀安全:: unordered_map

我將在地圖上閱讀和寫作(通過插入或刪除元素)。我聽說STL容器是安全的。如果是這樣,只使用互斥鎖進行寫操作是安全的?

我這麼問是因爲我需要在一個點到地圖的價值迭代,我想,當一個元素需要修改只能用我的互斥。

回答

1

它是安全的,僅用於寫入操作的互斥?

您需要確保在寫入地圖時不要嘗試從地圖讀取數據。所以你不需要鎖定一個互斥量,而只有讀取正在發生,但是如果有任何線程可以寫入,那麼所有線程(甚至是讀取器)都需要使用互斥鎖。

0

一般來說,沒有。讀者和作者都必須獲得互斥體。

否則,當有併發讀取和寫入,這會導致不確定的行爲,你的風險數據競爭。在實踐中,可能會導致崩潰,或讀者可能會損壞您從未放入地圖的數據。即使它看起來有效,它也會混淆像賽車探測器這樣的有用工具(例如,thread sanitizer,Helgrind)。它也使你的代碼可能不可移植。只有

如果你能證明沒有更多的作家地圖,和改變是對所有其他線程可見,情況發生了改變,現在所有的訪問都是讀者。此時,不能有任何數據競爭,並且可以安全地從地圖中讀取而不進行任何同步。

如果仍然有更新的可能性,您可以使用並行數據結構來避免鎖定。 C++ 11(和C++ 17)不提供,但有非標準的實現可用。在英特爾線程構建

  • Concurrent data structures

    所以,如果你真的需要的性能,你可以看看這些併發的哈希表的實現(否則只是結合使用std::unordered_map與互斥所有訪問)模塊(TBB)

  • Junction(似乎是最快的,但需要的螺紋時,不使用地圖它週期性地調用一個清除操作。這樣做是爲了回收內存,而不必使用垃圾收集器,如在引入blog post在「安全內存回收」中所述。)