简易信息网

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 8|回复: 0

一个单例工厂 并且是线程安全的

[复制链接]

31

主题

50

帖子

203

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
203
发表于 2018-1-1 15:18:32 | 显示全部楼层 |阅读模式
我们见到经常有人用 static 局部对象的方式实现了类似单例模式,最近发现一篇文章明确写明 编译器在处理  static局部变量的时候 并不是线程安全的 !!!

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

[cpp] view plain copy
print?


  • #ifndef SINGLETONFACTORY_H  
  • #define SINGLETONFACTORY_H  
  • #include "windows.h"  
  • #include <memory>  
  • namespace Tools  
  • {  
  • template<class T>class SingletonFactory  
  • {  
  • public:  
  •     virtual ~SingletonFactory()  
  •     {  
  •       :eleteCriticalSection(&__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);  
  •         :eaveCriticalSection(&__criticalSection);  
  •     }  
  •     return  __singletonObj;  
  • }  
  • }  
  •   
  • #endif // SINGLETONFACTORY_H  



测试代码

[cpp] view plain copy
print?


  • 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;  



  今天的心情非常美丽哦!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Comsenz Inc. ( 沪ICP备10006327号-1

GMT+8, 2018-1-19 15:23 , Processed in 0.047028 second(s), 22 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表