Linux线程(七)
生活随笔
收集整理的這篇文章主要介紹了
Linux线程(七)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Linux線程(七)
文章目錄
- Linux線程(七)
- 一、單例模式
- 二、STL、智能指針和線程安全
- 三、其他常見的鎖
一、單例模式
- 1.什么是單例模式?
單例模式是一種經典的“設計模式”,保證類在內存中只能有一個對象
- 2.什么是設計模式?
- 設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。
- 使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
- 毫無疑問,設計模式于己于他人于系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。
- 項目中合理地運用設計模式可以完美地解決很多問題,每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案,這也是設計模式能被廣泛應用的原因。
- 3.單例模式的特點:
- 私有化的構造函數
- 私有的靜態的全局變量
- 公有的靜態的方法
- 4.餓漢式和懶漢式的實現方法:
- 餓漢式:類加載的時候就實例化,并且創建單例對象,簡單來說,就是吃完飯立即洗完,下次就直接使用
- 懶漢式:默認不會實例化,什么時候用什么時候new
- 簡單來說,懶漢式就是吃完飯不立即洗碗,而是什么時候用,什么時候洗。懶漢式的優點思想是“延時加載”,從而能夠優化服務器的啟動數度
這樣寫懶漢式的實現方法有一個嚴重的缺陷:線程不安全,第一次調用時如果有兩個線程同時調用,可能會創建出兩個T類型對象的實例,后面調用就不會出現問題了。
- 懶漢式實現單例模式的線程安全版本
二、STL、智能指針和線程安全
- 1.STL中的容器是否線程安全:
答案是:
- 不是線程安全的。原因是:STL的設計初衷是將性能提升到極致,簡單來說STL就是為了代碼運行效率設計的,而一旦設計線程安全問題,會對代碼的性能造成巨大影響
- STL是在C++98就提出了,而線程安全是在C++11提出的
- 2.智能指針是否線程安全?
- 對于unique_ptr:由于只是在當前代碼塊的范圍內生效,因此不涉及線程安全問題
- 對于shared_ptr:多個對象需要需要共享一個引用計數變量,所以存在線程安全問題,但是標準庫實現的時候考慮到這個問題,基于原子操作的(CAS)方式保證shared_ptr的能夠高效,原子的操作引用計數
三、其他常見的鎖
- 悲觀鎖:在每次取數據時,總是擔心數據會被其他線程修改,所以會在取數據前先加鎖(讀鎖,寫鎖,行鎖等),當其他線程想要訪問數據時,被阻塞掛起
- 樂觀鎖:每次取數據時候,總是樂觀的認為數據不會被其他線程修改,因此不上鎖。但是在更新數據前,會判斷其他數據在更新前有沒有對數據進行修改。主要采用兩種方式:版本號機制和CAS操作
CAS操作:當需要更新數據時,判斷當前內存值和之前取得的值是否相等。如果相等則用新值更新。若不等則失敗,失敗則重試,一般是一個自旋的過程,即不斷重試
- 自旋鎖,公平鎖,非公平鎖
總結
以上是生活随笔為你收集整理的Linux线程(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux线程(六)
- 下一篇: Linux下通用的Makefile