日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux线程(七)

發布時間:2024/4/11 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux线程(七) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Linux線程(七)

文章目錄

  • Linux線程(七)
    • 一、單例模式
    • 二、STL、智能指針和線程安全
    • 三、其他常見的鎖

一、單例模式

  • 1.什么是單例模式?

單例模式是一種經典的“設計模式”,保證類在內存中只能有一個對象

  • 2.什么是設計模式?
  • 設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。
  • 使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
  • 毫無疑問,設計模式于己于他人于系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。
  • 項目中合理地運用設計模式可以完美地解決很多問題,每種模式在現實中都有相應的原理來與之對應,每種模式都描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案,這也是設計模式能被廣泛應用的原因。
  • 3.單例模式的特點:
  • 私有化的構造函數
  • 私有的靜態的全局變量
  • 公有的靜態的方法
  • 4.餓漢式和懶漢式的實現方法:
  • 餓漢式:類加載的時候就實例化,并且創建單例對象,簡單來說,就是吃完飯立即洗完,下次就直接使用
template<class T> class Singleton { public:static T* GetInstance(){return &data;}private:static T date; };
  • 懶漢式:默認不會實例化,什么時候用什么時候new
  • 簡單來說,懶漢式就是吃完飯不立即洗碗,而是什么時候用,什么時候洗。懶漢式的優點思想是“延時加載”,從而能夠優化服務器的啟動數度
template<class T> class Singleton { public: static T* GetInstance() {if(inst == NULL){inst == new T ();}return inst; }private:static T* inst;};

這樣寫懶漢式的實現方法有一個嚴重的缺陷:線程不安全,第一次調用時如果有兩個線程同時調用,可能會創建出兩個T類型對象的實例,后面調用就不會出現問題了。

  • 懶漢式實現單例模式的線程安全版本
template<class T> class Singleton { public://雙重判定空指針,降低鎖沖突的概率,提高性能,使用互斥鎖,保證多線程//下一次也只能new出一個對象實例static T* GetInstence(){if(inst == NULL)//第一重檢查,檢查inst是否已經指向某個對象實例,//注意此處在多線程的高并發情況下,可能會有多個//線程進入到第一個if里面{lock.lock();//加鎖,保證在多線程的情況下一次也只能有一個線程進入if(inst == NULL)//第二重檢查,檢查inst是否為空//假設沒有第二重檢查,那么前面說過,進入第一個if//里面的線程可能有多個,此時第一個線程獲得到鎖后,//new出一個對象,釋放鎖,接著第二個線程或得到鎖,//繼續new出對象,這樣就不滿足單例模式的要求。{inst = new T();}lock.unlock();}return inst;}private://使用volatile關鍵字,防止被編譯器優化volatile static T* inst;//這里使用volatile關鍵字的原因是://因為inst = new T();這條語句是非原子的,實際上會執行以下操作://a.在堆上開辟空間 b.初始化 c.把inst指向開辟的空間。//假設不加volatile關鍵字,那么正常的執行順序是abc,那么被編譯器//優化后的執行順須就可能變為bca等,就達不到new的目的,所以voaltile//的目的是禁止編譯器優化static std::mutex lock; };

二、STL、智能指針和線程安全

  • 1.STL中的容器是否線程安全:

答案是:

  • 不是線程安全的。原因是:STL的設計初衷是將性能提升到極致,簡單來說STL就是為了代碼運行效率設計的,而一旦設計線程安全問題,會對代碼的性能造成巨大影響
  • STL是在C++98就提出了,而線程安全是在C++11提出的
  • 2.智能指針是否線程安全?
  • 對于unique_ptr:由于只是在當前代碼塊的范圍內生效,因此不涉及線程安全問題
  • 對于shared_ptr:多個對象需要需要共享一個引用計數變量,所以存在線程安全問題,但是標準庫實現的時候考慮到這個問題,基于原子操作的(CAS)方式保證shared_ptr的能夠高效,原子的操作引用計數

三、其他常見的鎖

  • 悲觀鎖:在每次取數據時,總是擔心數據會被其他線程修改,所以會在取數據前先加鎖(讀鎖,寫鎖,行鎖等),當其他線程想要訪問數據時,被阻塞掛起
  • 樂觀鎖:每次取數據時候,總是樂觀的認為數據不會被其他線程修改,因此不上鎖。但是在更新數據前,會判斷其他數據在更新前有沒有對數據進行修改。主要采用兩種方式:版本號機制和CAS操作

CAS操作:當需要更新數據時,判斷當前內存值和之前取得的值是否相等。如果相等則用新值更新。若不等則失敗,失敗則重試,一般是一個自旋的過程,即不斷重試

  • 自旋鎖,公平鎖,非公平鎖

總結

以上是生活随笔為你收集整理的Linux线程(七)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。