C++線程安全的單例模式講解
廢話不多說,常用的代碼積淀下來。
一、懶漢模式
即第一次調(diào)用該類實例的時候才產(chǎn)生一個新的該類實例,并在以后僅返回此實例。
需要用鎖,來保證其線程安全性:原因:多個線程可能進入判斷是否已經(jīng)存在實例的if語句,從而non thread safety。
使用double-check來保證thread safety。但是如果處理大量數(shù)據(jù)時,該鎖才成為嚴重的性能瓶頸。
1、靜態(tài)成員實例的懶漢模式:
class Singleton { private: static Singleton* m_instance; Singleton(){} public: static Singleton* getInstance(); }; Singleton* Singleton::getInstance() { if(NULL == m_instance) { Lock();//借用其它類來實現(xiàn),如boost if(NULL == m_instance) { m_instance = new Singleton; } UnLock(); } return m_instance; }
2、內(nèi)部靜態(tài)實例的懶漢模式
這里需要注意的是,C++0X以后,要求編譯器保證內(nèi)部靜態(tài)變量的線程安全性,可以不加鎖。但C++ 0X以前,仍需要加鎖。
class SingletonInside { private: SingletonInside(){} public: static SingletonInside* getInstance() { Lock(); // not needed after C++0x static SingletonInside instance; UnLock(); // not needed after C++0x return instance; } };
二、餓漢模式:即無論是否調(diào)用該類的實例,在程序開始時就會產(chǎn)生一個該類的實例,并在以后僅返回此實例。
由靜態(tài)初始化實例保證其線程安全性,WHY?因為靜態(tài)實例初始化在程序開始時進入主函數(shù)之前就由主線程以單線程方式完成了初始化,不必擔心多線程問題。
故在性能需求較高時,應使用這種模式,避免頻繁的鎖爭奪。
class SingletonStatic { private: static const SingletonStatic* m_instance; SingletonStatic(){} public: static const SingletonStatic* getInstance() { return m_instance; } }; //外部初始化 before invoke main const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;
好了,線程單例模式就講到這里,還希望對大家有所幫助!
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
相關文章
C/C++?string.h庫中memcpy()和memmove()的使用
memcpy與memmove的目的都是將N個字節(jié)的源內(nèi)存地址的內(nèi)容拷貝到目標內(nèi)存地址中,本文主要介紹了C/C++?string.h庫中memcpy()和memmove()的使用,感興趣的可以了解一下2023-12-12opencv2基于SURF特征提取實現(xiàn)兩張圖像拼接融合
這篇文章主要為大家詳細介紹了opencv2基于SURF特征提取實現(xiàn)兩張圖像拼接融合,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03