全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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; 

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++线程安全的单例工厂  # C++  # 单例工厂  # 老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)  # 从C++单例模式到线程安全详解  # c++实现简单的线程池  # C++程序中启动线程的方法  # C++封装线程类的实现方法  # C++实现多线程查找文件实例  # C++使用CriticalSection实现线程同步实例  # C++ 线程(串行 并行 同步 异步)详解  # 多线程  # 实现了  # 希望能  # 谢谢大家  # 不安全  # 一篇文章  # 有人用  # 情况下  # cpp  # brush  # aspx  # pre  # class  # ifndef  # lt  # memory  # gt  # windows  # SINGLETONFACTORY_H  # define 


相关文章: 免费网站制作appp,免费制作app哪个平台好?  实现虚拟支付需哪些建站技术支撑?  历史网站制作软件,华为如何找回被删除的网站?  如何在云服务器上快速搭建个人网站?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  建站之星3.0如何解决常见操作问题?  如何通过西部建站助手安装IIS服务器?  南京网站制作费用,南京远驱官方网站?  如何打造高效商业网站?建站目的决定转化率  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  建站主机选购指南:核心配置优化与品牌推荐方案  javascript中对象的定义、使用以及对象和原型链操作小结  常州自助建站费用包含哪些项目?  三星网站视频制作教程下载,三星w23网页如何全屏?  5种Android数据存储方式汇总  临沂网站制作公司有哪些,临沂第四中学官网?  建站主机选择指南:服务器配置与SEO优化实战技巧  招商网站制作流程,网站招商广告语?  公司门户网站制作流程,华为官网怎么做?  ,有什么在线背英语单词效率比较高的网站?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  如何通过虚拟主机快速搭建个人网站?  如何在阿里云部署织梦网站?  如何破解联通资金短缺导致的基站建设难题?  小型网站建站如何选择虚拟主机?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  建站之星如何防范黑客攻击与数据泄露?  定制建站策划方案_专业建站与网站建设方案一站式指南  大连网站制作公司哪家好一点,大连买房网站哪个好?  建站之星备案是否影响网站上线时间?  如何通过宝塔面板实现本地网站访问?  PHP 500报错的快速解决方法  如何快速搭建FTP站点实现文件共享?  如何快速搭建二级域名独立网站?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  制作电商网页,电商供应链怎么做?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  如何快速配置高效服务器建站软件?  如何登录建站主机?访问步骤全解析  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  建站主机默认首页配置指南:核心功能与访问路径优化  宝塔新建站点报错如何解决?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  建站主机与虚拟主机有何区别?如何选择最优方案?  如何彻底卸载建站之星软件?  如何确保FTP站点访问权限与数据传输安全?  音乐网站服务器如何优化API响应速度?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。