国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現一個線程安全的單例工廠實現代碼

2020-01-26 14:08:21
字體:
來源:轉載
供稿:網友

  C++實現一個線程安全的單例工廠實現代碼

我們見到經常有人用 static 局部對象的方式實現了類似單例模式,最近發現一篇文章明確寫明 編譯器在處理  static局部變量的時候 并不是線程安全的 !?。?br />

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; 

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武平县| 铜山县| 孟州市| 克东县| 河东区| 越西县| 麻栗坡县| 松滋市| 克什克腾旗| 三台县| 朝阳区| 安徽省| 菏泽市| 南丰县| 瑞金市| 固镇县| 晋州市| 慈利县| 涿州市| 凯里市| 颍上县| 渑池县| 定兴县| 乌拉特后旗| 宁河县| 彰化市| 北票市| 安康市| 新绛县| 乌兰浩特市| 西丰县| 信丰县| 长泰县| 南昌县| 东阳市| 若羌县| 定远县| 云和县| 左权县| 望奎县| 海宁市|