2013-04-17 36 views
0

你有沒有理由不能使用方括號運算符來訪問concurrent_hash_map?TBB concurrent_hash_map運算符[]或類似的訪問?

我爲了緩解代碼的可讀性一直這樣做(在密鑰應該是在地圖):

template <class Tkey, class Tval> 
Tval concHashMapGet(concurrent_hash_map < Tkey, Tval >& chm , Tkey key) 
{ 
    concurrent_hash_map< Tkey, Tval >::const_accessor a; 

    if (chm.find(a, key)) 
     return a->second; 
    else 
     throw; 
}; //Will .release() when out of scope 

,我想知道我是否已經錯過一些關於正確使用,因爲看起來你需要獲得一個訪問器,然後運行find,然後獲取該值,然後釋放訪問器。所有這些都在正常映射或c#中的ConcurrentDictionary中使用方括號運算符完成。 (好吧,我猜STL地圖中沒有同步,但我在方括號後面。)

此外,如果您發現此功能的任何問題,請告訴我。據我所知,編譯器應該內聯它?

回答

2

你的邏輯看起來不錯,據我所知,沒有更簡單的方法去做。 concurrent_hash_map沒有operator []的原因是,如果它返回一個引用,如std :: map :: opreator [],我們將不得不選擇一個默認鎖(accessor或const_accessor),無論我們選擇哪一個,它可能是在某些使用情況下是錯誤的選擇。所以我們迫使來電者做出選擇。

如果您不需要同時擦除項目,請考慮使用tbb :: concurrent_unordered_map代替。這是一個更新的設計,它有一個無鎖界面,並且有operator []。

關於代碼示例,「throw」需要拋出一些東西,除非代碼總是從try-block處理程序中調用。

+0

是的,我認爲我會拋出扔在那裏,因爲我的代碼應該爲它所要求的每個密鑰都有一些東西。簡單的方法來捕捉潛在的邏輯錯誤。我想我會在其他地方使用它時對其進行修改。 – Carlos