C++ 线程安全的单例模式
轉(zhuǎn)載:https://www.cnblogs.com/ccdev/archive/2012/12/19/2825355.html
廢話不多說,常用的代碼積淀下來。
一、懶漢模式:即第一次調(diào)用該類實(shí)例的時(shí)候才產(chǎn)生一個(gè)新的該類實(shí)例,并在以后僅返回此實(shí)例。
需要用鎖,來保證其線程安全性:原因:多個(gè)線程可能進(jìn)入判斷是否已經(jīng)存在實(shí)例的if語句,從而non thread safety.
使用double-check來保證thread safety.但是如果處理大量數(shù)據(jù)時(shí),該鎖才成為嚴(yán)重的性能瓶頸。
1、靜態(tài)成員實(shí)例的懶漢模式:
1 class Singleton 2 { 3 private: 4 static Singleton* m_instance; 5 Singleton(){} 6 public: 7 static Singleton* getInstance(); 8 }; 9 10 Singleton* Singleton::getInstance() 11 { 12 if(NULL == m_instance) 13 { 14 Lock();//借用其它類來實(shí)現(xiàn),如boost 15 if(NULL == m_instance) 16 { 17 m_instance = new Singleton; 18 } 19 UnLock(); 20 } 21 return m_instance; 22 }2、內(nèi)部靜態(tài)實(shí)例的懶漢模式
這里需要注意的是,C++0X以后,要求編譯器保證內(nèi)部靜態(tài)變量的線程安全性,可以不加鎖。但C++ 0X以前,仍需要加鎖。
1 class SingletonInside 2 { 3 private: 4 SingletonInside(){} 5 public: 6 static SingletonInside* getInstance() 7 { 8 Lock(); // not needed after C++0x 9 static SingletonInside instance; 10 UnLock(); // not needed after C++0x 11 return instance; 12 } 13 };二、餓漢模式:即無論是否調(diào)用該類的實(shí)例,在程序開始時(shí)就會(huì)產(chǎn)生一個(gè)該類的實(shí)例,并在以后僅返回此實(shí)例。
由靜態(tài)初始化實(shí)例保證其線程安全性,WHY?因?yàn)殪o態(tài)實(shí)例初始化在程序開始時(shí)進(jìn)入主函數(shù)之前就由主線程以單線程方式完成了初始化,不必?fù)?dān)心多線程問題。
故在性能需求較高時(shí),應(yīng)使用這種模式,避免頻繁的鎖爭(zhēng)奪。
1 class SingletonStatic 2 { 3 private: 4 static const SingletonStatic* m_instance; 5 SingletonStatic(){} 6 public: 7 static const SingletonStatic* getInstance() 8 { 9 return m_instance; 10 } 11 }; 12 13 //外部初始化 before invoke main 14 const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;總結(jié)
以上是生活随笔為你收集整理的C++ 线程安全的单例模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MMKV源码解析
- 下一篇: R2CNN 算法笔记