C++實現一個線程安全的單例工廠實現代碼。本站提示廣大學習愛好者:(C++實現一個線程安全的單例工廠實現代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C++實現一個線程安全的單例工廠實現代碼正文
投稿:lqh
這篇文章主要介紹了 C++實現一個線程安全的單例工廠實現代碼的相關資料,需要的朋友可以參考下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;
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!