我有這個經典問題。我有STL地圖< StudentName,Marks>其中StudentName是字符串,標記是整數。現在STL地圖的高效線程同步技術
,在我的應用程序,多個線程正在訪問這個地圖:
- 查找StudentName。如果存在,增加其商標StudentName的
- 減少標記
- 添加StudentName到地圖
- 從地圖中刪除StudentName
問題:什麼是最有效的方法做上述的STL操作多線程環境中的地圖?
當前解決方案: 在地圖上執行所有這些操作的代碼放在臨界區域內。但這是性能下降。 (?舉例來說,如果一個線程是添加標記特定的學生,爲什麼誰想要添加標記爲不同的學生其他線程需要等待)
這是我認爲可以做: 我收集關於SO上其他類似問題/答案在地圖上多線程的信息,這裏是我認爲我需要做的。提供STL的地圖都不是線程安全的,(即當正在更新它沒有其他線程應該訪問地圖)
- 我想把只有最後兩個(添加/刪除StudentName)活動的獨家(沒有其他活動應該做的事在並行而添加/刪除從地圖元素/)
- 不允許多個線程訪問地圖的相同元素(這樣,多線程不能試圖增加同學生/減少標誌同時)
但我不知道我怎麼能做到這一點(可以使用什麼線程同步對象/技術)我正在通過VS2010在Windows上開發此應用程序
這裏有任何建議或替代方法嗎?
更新: 感謝大家的意見。不幸的是,在VS2010中沒有可用的原子整數。所以,這是我打算根據你的意見做的事情。我有三種鎖: 上圖:map_read_lock,map_write_lock 上的元素:element_write_lock (對於每個元素)
現在,
當在地圖中尋找元素:獲取map_read_lock (這將請允許我同時認定)
當添加/刪除元素映射:獲取map_write_lock (這將防止容器的併發更新,我相信,不推薦)
當更改值時:Get(map_read_lock & element_write_lock)(這將允許並行更改爲不同的值,但會阻止同時更改爲相同的值。此外,將防止容器更新時的值更改,反之亦然)
請建議這聽起來不錯。
使用互斥鎖,即boost :: mutex和scope_lock。最重要的鎖只有當你必須和只是一段時間。例如,當您將元素插入到地圖中並獲取值時。就這樣。順便說一句,考慮使用hashmap即std :: unordered_map - 在某些情況下它更有效。 – LukeCodeBaker
'提供的STL映射不是線程安全的(即沒有其他線程應該在更新時訪問映射)'不完全,我已經在這裏回答了類似的問題http://stackoverflow.com/questions/16130494/are- stdmap-and-stdvector-thread-safe/16130513#16130513如果您不修改映射本身,則可以訪問它的讀寫元素,前提是沒有給定元素的競爭條件。 – alexrider
@LukeCodeBaker他需要以某種方式同步他所有的操作。 –