接上一篇STL容器刪除操做繼續,STL使用起來方便,還有自動內存管理,再結合合適的泛型算法大大提升了咱們編程的效率,因而咱們「肆無忌憚」的使用在本身的程序中。可是隻要你有「肆無忌憚」的態度,你終歸是要走上彎路的,好比其線程安全問題。先從《Effective STL》進行搬運。git
線程安全的狀況github
多個讀取者是安全的。多線程可能同時讀取一個容器的內容,這將正確地執行。固然,在讀取時不能 有任何寫入者操做這個容器。算法
對不一樣容器的多個寫入者是安全的。多線程能夠同時寫不一樣的容器。編程
線程不安全的狀況安全
在對同一個容器進行多線程的讀寫、寫操做時。多線程
在每次調用容器的成員函數期間都要鎖定該容器。ide
在每一個容器返回的迭代器(例如經過調用begin或end)的生存期以內都要鎖定該容器。函數
在每一個在容器上調用的算法執行期間鎖定該容器。線程
看到風險了吧?在工程中多線程操做STL的場景應該仍是比較常見的,一個典型的例子就是用其來作生產者——消費者模型的隊列或者其餘共享隊列,這樣爲了應對線程安全問題咱們必須本身對容器操做進行封裝。這是我本身實現的的封裝類threadSafe_container.h,另外書中給咱們介紹了一種更通用的封裝方法,你們能夠本身去參考實現code
template<typename Container> // 獲取和釋放容器的互斥量 class Lock { // 的類的模板核心; public: // 忽略了不少細節 Lock(const Containers container) : c(container) { getMutexFor(c); // 在構造函數獲取互斥量 } ~Lock() { releaseMutexFor(c); // 在析構函數裏釋放它 } private: const Container& c; };