STL容器是否是線程安全的


轉載http://blog.csdn.net/zdl1016/article/details/5941330

STL的線程安全. 說一些關於stl容器的線程安全相關的話題。

一般說來,stl對於多線程的支持僅限於下列兩點:(貌似Effective STL中有描述)

1.多個讀取者是安全的。即多個線程可以同時讀取一個容器中的內容。 即此時多個線程調用 容器的不涉及到寫的接口都可以 eg find, begin, end 等.

2.對不同容器的多個寫入者是安全的。即多個線程對不同容器的同時寫入合法。 但是對於同一容器當有線程寫,有線程讀時,如何保證正確? 需要程序員自己來控制,比如:線程A讀容器某一項時,線程B正在移除該項。這會導致一下無法預知的錯誤。 通常的解決方式是用開銷較小的臨界區(CRITICAL_SECTION)來做同步。以下列方式同步基本上可以做到線程安全的容器(就是在有寫操作的情況下仍能保證安全)。

  1.每次調用容器的成員函數的期間需要鎖定

  2.每個容器容器返回迭代器的生存期需要鎖定

  3.每個容器在調用算法的執行期需要鎖定

 

  和小羅的關於task_server的多線程安全的交流: 是這樣的, 當你調用map的任何接口時, 比如 end(), begin(), find()等時, 可能會返回一個iterator, 如果有別的線程正在修改這個map, 你的iterator就變得無效了, 再用這個iterator行為就可能出問題. 或者在find()函數內部, 會訪問到map內部的紅黑樹的數據結構, 而這個紅黑樹是有可能被別的線程調整的(比如別的現在往map中插入一個不存在的記錄). 所以, 是危險的.

 

  查了一下官方文檔對線程安全的描述。其大意也是,為了效率,沒有給所有操作加鎖。不同線程同時讀同一容器對象沒關系,不同線程同時寫不同的容器對象沒關系。但不能同時又讀又寫同一容器對象的。因此,多線程要同時讀寫時,還是要自己加鎖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM