轉載http://blog.csdn.net/zdl1016/article/details/5941330程序員
STL的線程安全. 說一些關於stl容器的線程安全相關的話題。web
通常說來,stl對於多線程的支持僅限於下列兩點:(貌似Effective STL中有描述)算法
1.多個讀取者是安全的。即多個線程能夠同時讀取一個容器中的內容。 即此時多個線程調用 容器的不涉及到寫的接口均可以 eg find, begin, end 等.安全
2.對不一樣容器的多個寫入者是安全的。即多個線程對不一樣容器的同時寫入合法。 可是對於同一容器當有線程寫,有線程讀時,如何保證正確? 須要程序員本身來控制,好比:線程A讀容器某一項時,線程B正在移除該項。這會致使一下沒法預知的錯誤。 一般的解決方式是用開銷較小的臨界區(CRITICAL_SECTION)來作同步。如下列方式同步基本上能夠作到線程安全的容器(就是在有寫操做的狀況下仍能保證安全)。數據結構
1.每次調用容器的成員函數的期間須要鎖定。多線程
2.每一個容器容器返回迭代器的生存期須要鎖定。函數
3.每一個容器在調用算法的執行期須要鎖定。spa
和小羅的關於task_server的多線程安全的交流: 是這樣的, 當你調用map的任何接口時, 好比 end(), begin(), find()等時, 可能會返回一個iterator, 若是有別的線程正在修改這個map, 你的iterator就變得無效了, 再用這個iterator行爲就可能出問題. 或者在find()函數內部, 會訪問到map內部的紅黑樹的數據結構, 而這個紅黑樹是有可能被別的線程調整的(好比別的如今往map中插入一個不存在的記錄). 因此, 是危險的..net
查了一下官方文檔對線程安全的描述。其大意也是,爲了效率,沒有給全部操做加鎖。不一樣線程同時讀同一容器對象不要緊,不一樣線程同時寫不一樣的容器對象不要緊。但不能同時又讀又寫同一容器對象的。所以,多線程要同時讀寫時,仍是要本身加鎖。線程