2010-11-30 60 views
3

我使用Boost的unordered_map。有沒有unordered_map的同步版本?這是因爲我有相當多的unordered_map並手動同步它使用鎖定會非常混亂。在C++中同步unordered_map

謝謝。

回答

7

由於存在與檢索迭代器和字符串內部位置相關的競爭條件,然後嘗試在以後的操作中使用它們,所以不可能有用地封裝提供類似STL的接口的容器(unordered_map也這樣做)。如果您可以找到一些適合您需求的不太靈活的接口,也許可以將任何複雜的操作放入單個鎖定的函數調用中,那麼您可以輕鬆地在容器中包裝一個線程安全類,以簡化您的使用。

4

你確定這是你需要的嗎?

while (!stack.empty()) 
{ 
    Element const e = stack.top(); 


    stack.pop(); 
} 

在單線程中,此代碼看起來是正確的。但是,如果你想使用多線程,只需要一個同步堆棧就不會削減它。

如果其他人彈出最後一個元素後,會發生什麼?您測試了空虛後?

有多個容器同步去多線程。也就是說,你可以嘗試TBB。

2

使用Folly的AtomicHashmap

Folly's documentation在Github上

愚蠢/ AtomicHashmap.h介紹了大量多線程環境設計擁有極高的性能同步UnorderedAssociativeContainer實現(約2-5x比TBB :: concurrent_hash_map更快)和良好的內存使用性能。查找和迭代是免等待的,插入具有鍵級鎖粒度,只有很少的內存開銷,並且可以使用永久的32位ID來引用每個元素。

雖然它帶有一些limitations