2011-11-22 92 views
8

這是關於線程安全的std::map。現在,同時讀取是線程安全的,但寫入不是。我的問題是,如果我每次向地圖添加獨特的元素,是否會線程安全?C++映射的線程安全

  1. 所以,舉例來說,如果我有一張地圖這樣std:map<int, std::string> myMap ,我總是添加新鍵,從來沒有修改現有的鍵值,那將是線程安全的?

  2. 更重要的是,這會給我任何隨機的運行時行爲嗎?

  3. 添加新密鑰也被認爲是修改嗎?如果添加鍵時總是不同,它不應該是線程安全的,因爲它修改了內存的獨立部分?

感謝 希夫

+0

不,這不會是線程安全的,因爲兩個線程可以一次添加兩個(唯一的)項目,它們將在同一個地方。 –

+0

你可以從標準容器中得到的唯一線程安全性是,如果容器永遠不會被修改,並且每個線程訪問(讀取或寫入)一個**不同的**元素,那應該沒問題。 –

回答

14

1)當然不是

2)是的,我希望在測試過程中,你會遇到它,而不是後來

3)是的,它是。新元素被添加到不同的位置,但許多指針在此期間被修改。

在大多數情況下,如果不是所有的實現,該映射都是通過某種樹實現的。在樹中插入一個新元素,通過重新設置指向不同節點的指針重新排列節點來修改它。所以它不是線程安全的

+1

+1,正好.... –

+0

@armen什麼是最好的選擇呢? –

+0

@EdwinVivekN:在同時使用STL容器時,您需要使用外部同步機制(例如互斥鎖) –

0

不,是的,是的。在修改容器(包括插入新密鑰)時,您需要獲得獨佔鎖定,儘管當前沒有修改,當然可以同時安全讀取。

編輯:http://www.sgi.com/tech/stl/thread_safety.html可能是你感興趣的。