C++實現一個執行緒安全的單例工廠
我們見到經常有人用 static 區域性物件的方式實現了類似單例模式,最近發現一篇文章明確寫明 編譯器在處理 static區域性變數的時候 並不是執行緒安全的 !!!
http://blogs.msdn.com/b/oldnewthing/archive/2004/03/08/85901.aspx
於是實現了一個單例工廠 並且是執行緒安全的
#ifndef SINGLETONFACTORY_H #define SINGLETONFACTORY_H #include "windows.h" #include <memory> namespace Tools { template<class T>class SingletonFactory { public: virtual ~SingletonFactory() { ::DeleteCriticalSection(&__criticalSection); } std::auto_ptr<T>& GetInstance(); static SingletonFactory<T>* CreateSingletonFactory(); private: SingletonFactory() { ::InitializeCriticalSection(&__criticalSection); } std::auto_ptr<T> __singletonObj; CRITICAL_SECTION __criticalSection; }; //初始化建立 後續在多執行緒中使用 //還有另一種寫法是單獨的函式直接返回內部單例包裝靜態成員在 多執行緒情況下不安全 //SingletonFactory::CreateSingletonFactory().GetInstance(); template<class T> SingletonFactory<T>* SingletonFactory<T>::CreateSingletonFactory(){ static SingletonFactory<T> temObj; return &temObj; } //工廠例項 template<class T> std::auto_ptr<T>& SingletonFactory<T>::GetInstance() { if(__singletonObj.get()==0) { ::EnterCriticalSection(&__criticalSection); if(__singletonObj.get()==0) __singletonObj=std::auto_ptr<T>(new T); ::LeaveCriticalSection(&__criticalSection); } return __singletonObj; } } #endif // SINGLETONFACTORY_H
測試程式碼
SingletonFactory<Data1>*singleton1=SingletonFactory<Data1>::CreateSingletonFactory(); singleton1->GetInstance()->x=100; cout<<singleton1->GetInstance()->x<<endl; singleton1->GetInstance()->y=200; cout<<singleton1->GetInstance()->x<<endl; cout<<singleton1->GetInstance()->y<<endl; SingletonFactory<Data2>*singleton2=SingletonFactory<Data2>::CreateSingletonFactory(); singleton2->GetInstance()->x=100; cout<<singleton2->GetInstance()->x<<endl; singleton2->GetInstance()->y=200; cout<<singleton2->GetInstance()->x<<endl; cout<<singleton2->GetInstance()->y<<endl;
相關文章
- c++ 運算子過載、執行緒安全實現單例C++執行緒單例
- C++ 執行緒安全的單例模式C++執行緒單例模式
- ios中的執行緒安全單例實現iOS執行緒單例
- 不使用synchronized和lock,如何實現一個執行緒安全的單例?synchronized執行緒單例
- 單例模式——執行緒安全的兩種實現單例模式執行緒
- 執行緒安全的單例模式執行緒單例模式
- python 執行緒安全的 單例 實現 日誌分級Python執行緒單例
- 多執行緒實現多工一執行緒
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- Python 實現工廠模式、抽象工廠,單例模式Python模式抽象單例
- 靜態內部類實現的單例模式是執行緒安全的單例模式執行緒
- C++ 靜態變數單例模式的誤會(執行緒安全)C++變數單例模式執行緒
- Qt 中用Q_GLOBAL_STATIC來實現執行緒安全的單例模式QT執行緒單例模式
- 【C++】實現一個簡單的單例模式C++單例模式
- Java利用執行緒工廠監控執行緒池Java執行緒
- 單例模式執行緒安全reorder問題單例模式執行緒
- 如何設計並實現一個執行緒安全的 Map ?(下篇)執行緒
- 如何設計並實現一個執行緒安全的 Map ?(上篇)執行緒
- 多執行緒實現多工二執行緒
- 你的單例模式真的是執行緒安全的嗎?單例模式執行緒
- C++實現工廠模式C++模式
- 設計模式之單例模式(執行緒安全)設計模式單例執行緒
- 構建穩固基石:C++執行緒安全Map的簡單實現與應用C++執行緒
- disruptor如何實現每CPU執行一個執行緒?執行緒
- 多執行緒下的單例執行緒單例
- java 簡單工廠模式(實現一個計算器)Java模式
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 5招教你實現多執行緒場景下的執行緒安全!執行緒
- 託管C++執行緒鎖實現C++執行緒
- 工廠+單例模式單例模式
- Java執行緒(一):執行緒安全與不安全Java執行緒
- c++實現程式與執行緒的同步互斥C++執行緒
- Map實現執行緒安全的3種方式執行緒
- java多執行緒與併發 - 自己實現一個簡單的鎖(實現Lock介面)Java執行緒
- 簡單C++執行緒池C++執行緒
- ios-UI高階多執行緒 GCD實現單例模式iOSUI執行緒GC單例模式
- 單例模式中可能存在的一些問題(執行緒安全問題)單例模式執行緒
- 面試官:如何自定義一個工廠類給執行緒池命名,我:現場手撕嗎?面試執行緒