C++实现一个线程安全的单例工厂

我们见到经常有人用 static 局部对象的方式实现了类似单例模式,最近发现一篇文章明确写明 编译器在处理  static局部变量的时候 并不是线程安全的 !!!

http://blogs.msdn.com/b/oldnewthing/archive/2004/03/08/85901.aspx     

https://blog.csdn.net/yue7603835/article/details/49704423


于是实现了一个单例工厂  并且是线程安全的

[cpp]  view plain  copy
  1. #ifndef SINGLETONFACTORY_H  
  2. #define SINGLETONFACTORY_H  
  3. #include "windows.h"  
  4. #include <memory>  
  5. namespace Tools  
  6. {  
  7. template<class T>class SingletonFactory  
  8. {  
  9. public:  
  10.     virtual ~SingletonFactory()  
  11.     {  
  12.       ::DeleteCriticalSection(&__criticalSection);  
  13.     }  
  14.     std::auto_ptr<T>& GetInstance();  
  15.     static SingletonFactory<T>* CreateSingletonFactory();  
  16. private:  
  17.     SingletonFactory()  
  18.     {  
  19.        ::InitializeCriticalSection(&__criticalSection);  
  20.     }  
  21.     std::auto_ptr<T> __singletonObj;  
  22.     CRITICAL_SECTION __criticalSection;  
  23. };  
  24.   
  25. //初始化创建  后续在多线程中使用  
  26. //还有另一种写法是单独的函数直接返回内部单例包装静态成员在 多线程情况下不安全  
  27. //SingletonFactory::CreateSingletonFactory().GetInstance();  
  28. template<class T> SingletonFactory<T>* SingletonFactory<T>::CreateSingletonFactory(){  
  29.     static SingletonFactory<T> temObj;  
  30.     return &temObj;  
  31. }  
  32. //工厂实例  
  33. template<class T> std::auto_ptr<T>&  SingletonFactory<T>::GetInstance()  
  34. {  
  35.     if(__singletonObj.get()==0)  
  36.     {  
  37.         ::EnterCriticalSection(&__criticalSection);  
  38.         if(__singletonObj.get()==0)  
  39.             __singletonObj=std::auto_ptr<T>(new T);  
  40.         ::LeaveCriticalSection(&__criticalSection);  
  41.     }  
  42.     return  __singletonObj;  
  43. }  
  44. }  
  45.   
  46. #endif // SINGLETONFACTORY_H  

测试代码 

[cpp]  view plain  copy
  1. SingletonFactory<Data1>*singleton1=SingletonFactory<Data1>::CreateSingletonFactory();  
  2. singleton1->GetInstance()->x=100;  
  3. cout<<singleton1->GetInstance()->x<<endl;  
  4. singleton1->GetInstance()->y=200;  
  5. cout<<singleton1->GetInstance()->x<<endl;  
  6. cout<<singleton1->GetInstance()->y<<endl;  
  7.   
  8. SingletonFactory<Data2>*singleton2=SingletonFactory<Data2>::CreateSingletonFactory();  
  9. singleton2->GetInstance()->x=100;  
  10. cout<<singleton2->GetInstance()->x<<endl;  
  11. singleton2->GetInstance()->y=200;  
  12. cout<<singleton2->GetInstance()->x<<endl;  
  13. cout<<singleton2->GetInstance()->y<<endl;  

猜你喜欢

转载自blog.csdn.net/zb872676223/article/details/79992352