2016-01-21 146 views
0

我正在尋找線程安全映射的解決方案,但包括tbb所有內容庫都不是線程安全的用於擦除,清除函數。我不想因爲性能問題使用互斥鎖。我在互聯網上搜索了很長時間,但我仍然無法找到任何有關這方面的例子,而且我對長文章也有不好的看法。我搜索了很多東西,例如const,對於C++ 11來說是線程安全的但我無法弄清楚。線程安全的TBB :: concurrent_hash_map擦除

我試圖複製地圖,但它也不是線程安全的。

__forceinline ActiveMap & GetActiveMap() { return m_activeCollection; } 

此代碼崩潰時,我試圖複製地圖,而另一個線程在它。

+1

你錯了,'tbb :: concurrent_hash_map :: erase'是線程安全的 – Anton

+0

整個容器操作如賦值或拷貝不是線程安全的。您可以使用'tbb :: spin_rw_lock'爲了保護它以便拍攝快照 – Anton

回答

2

(我猜你是使用Visual C++,因爲__forceinline keyword`的)

  1. 的Visual Studio 2013(我猜的Visual Studio 2015)配備了小組併發數據結構。標頭<concurrent_unordered_map.h>實現可以使用的併發映射。

  2. 嘗試使用鎖來分析您的應用程序。超薄的讀寫器鎖通常並不那麼糟糕,可能就足夠了。

+0

我使用的是visual studio 2015,我將使用reader lock來查找,開始,結束和使用write進行插入和擦除嗎? – 0sk1

+0

用它來做任何事情。爲每個函數使用read模式,const函數和寫模式的ebery函數不是'const'。令人驚訝的是,自從語言剛剛誕生以來,const建議的線程安全性如何? –

+0

我添加了一個新的答案,我編寫了一個代碼,你知道更多的技巧來提高性能嗎? – 0sk1