2011-11-01 33 views
2

我正在尋找使用STL容器(如std :: map和std :: vector)和pthreads的最佳策略。Linux中的STL容器和線程(併發寫入)

什麼是規範的路要走?一個簡單的例子:

std::map<string, vector<string>> myMap; 

我們如何保證併發性?

mutex_lock; 
write at myMap; 
mutex_unlock; 

此外,我想知道如果pthreads和STL在使用時遇到性能問題。

系統:LIUNX,G ++,並行線程,無刺激,無英特爾TBB

回答

5

的C++ 03標準不談論併發可言,所以併發方面拋棄了,因爲一個實現細節的編譯器。所以編譯器附帶的文檔是應該查看與併發有關的答案的地方。

大多數STL實現都不是線程安全的。

由於STL容器不提供任何明確的線程安全性,所以是的,你將不得不使用你自己的同步機制。而當你在這裏你應該使用RAII而不是手動管理同步資源(互斥鎖等)。

你可以在這裏參照本細則:

MSDN:

如果一個對象正由一個線程寫入,那麼所有的讀取和寫入該對象相同或其他線程必須得到保護。例如,假設一個對象,如果線程1被寫入,那麼線程2必須從讀取或寫入A.

GCC Documentation阻止說:
我們目前使用的SGI STL

的SGI實現STL是線程安全只有在這個意義上,同時訪問不同容器是安全的,並同時進行讀取訪問到共享容器安全:線程安全,其中規定的定義。如果多個線程訪問單個容器,並且至少有一個線程可能會寫入,則用戶負責確保容器訪問期間線程之間的相互排斥。

注意事項:GCC的標準庫是SGI的STL代碼的衍生產品。

+0

RAII是一個好主意,但是當我將元素push_back到我的向量時,這是否適用? – cateof

+0

@cateof:是的,如果在調用'push_back'時某個其他線程正在讀取矢量,那麼這是一個問題。所以是的。 –

0

提供併發性的規範方式是在訪問集合時持有鎖。

無論如何,在90%的情況下,這種方式對集合的訪問不是性能至關重要。如果您訪問的共享收藏夾太多,鎖定它會損害性能,您應該重新考慮您的設計。(可能性是,你的設計沒問題,它不會影響任何接近你可能懷疑的性能。)

0

你應該看看英特爾線程構建模塊tbb(http://threadingbuildingblocks.org/)。他們有一些非常優化的數據結構,它們在內部使用非阻塞策略處理併發性。

+0

@Micheal,我的壞。我們不能從TBB使用concurrent_vector。我會更新我的問題 – cateof