這是關於線程安全的std::map
。現在,同時讀取是線程安全的,但寫入不是。我的問題是,如果我每次向地圖添加獨特的元素,是否會線程安全?C++映射的線程安全
所以,舉例來說,如果我有一張地圖這樣
std:map<int, std::string> myMap
,我總是添加新鍵,從來沒有修改現有的鍵值,那將是線程安全的?更重要的是,這會給我任何隨機的運行時行爲嗎?
添加新密鑰也被認爲是修改嗎?如果添加鍵時總是不同,它不應該是線程安全的,因爲它修改了內存的獨立部分?
感謝 希夫
這是關於線程安全的std::map
。現在,同時讀取是線程安全的,但寫入不是。我的問題是,如果我每次向地圖添加獨特的元素,是否會線程安全?C++映射的線程安全
所以,舉例來說,如果我有一張地圖這樣std:map<int, std::string> myMap
,我總是添加新鍵,從來沒有修改現有的鍵值,那將是線程安全的?
更重要的是,這會給我任何隨機的運行時行爲嗎?
添加新密鑰也被認爲是修改嗎?如果添加鍵時總是不同,它不應該是線程安全的,因爲它修改了內存的獨立部分?
感謝 希夫
1)當然不是
2)是的,我希望在測試過程中,你會遇到它,而不是後來
3)是的,它是。新元素被添加到不同的位置,但許多指針在此期間被修改。
在大多數情況下,如果不是所有的實現,該映射都是通過某種樹實現的。在樹中插入一個新元素,通過重新設置指向不同節點的指針重新排列節點來修改它。所以它不是線程安全的
+1,正好.... –
@armen什麼是最好的選擇呢? –
@EdwinVivekN:在同時使用STL容器時,您需要使用外部同步機制(例如互斥鎖) –
不,是的,是的。在修改容器(包括插入新密鑰)時,您需要獲得獨佔鎖定,儘管當前沒有修改,當然可以同時安全讀取。
編輯:http://www.sgi.com/tech/stl/thread_safety.html可能是你感興趣的。
不,這不會是線程安全的,因爲兩個線程可以一次添加兩個(唯一的)項目,它們將在同一個地方。 –
你可以從標準容器中得到的唯一線程安全性是,如果容器永遠不會被修改,並且每個線程訪問(讀取或寫入)一個**不同的**元素,那應該沒問題。 –