我使用Boost的unordered_map。有沒有unordered_map的同步版本?這是因爲我有相當多的unordered_map並手動同步它使用鎖定會非常混亂。在C++中同步unordered_map
謝謝。
我使用Boost的unordered_map。有沒有unordered_map的同步版本?這是因爲我有相當多的unordered_map並手動同步它使用鎖定會非常混亂。在C++中同步unordered_map
謝謝。
由於存在與檢索迭代器和字符串內部位置相關的競爭條件,然後嘗試在以後的操作中使用它們,所以不可能有用地封裝提供類似STL的接口的容器(unordered_map也這樣做)。如果您可以找到一些適合您需求的不太靈活的接口,也許可以將任何複雜的操作放入單個鎖定的函數調用中,那麼您可以輕鬆地在容器中包裝一個線程安全類,以簡化您的使用。
英特爾的Thread Building Blocks庫有一個類tbb::concurrent_hash_map
這是一個無序的映射,允許併發訪問。它在內部使用細粒度鎖定方案實現,但基本結果是您可以在沒有競爭條件的情況下訪問它。
你確定這是你需要的嗎?
while (!stack.empty())
{
Element const e = stack.top();
stack.pop();
}
在單線程中,此代碼看起來是正確的。但是,如果你想使用多線程,只需要一個同步堆棧就不會削減它。
如果其他人彈出最後一個元素後,會發生什麼?您測試了空虛後?
有多個容器同步去多線程。也就是說,你可以嘗試TBB。
使用Folly的AtomicHashmap
。
從Folly's documentation在Github上
愚蠢/ AtomicHashmap.h介紹了大量多線程環境設計擁有極高的性能同步UnorderedAssociativeContainer實現(約2-5x比TBB :: concurrent_hash_map更快)和良好的內存使用性能。查找和迭代是免等待的,插入具有鍵級鎖粒度,只有很少的內存開銷,並且可以使用永久的32位ID來引用每個元素。
雖然它帶有一些limitations。