• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++实现一个线程安全的单例工厂实现代码

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++多线程,c++多线程编程,c++多线程编程实例,c++多线程实例,c++多线程面试题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

  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 

</div>

测试代码

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; 
</div>

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ 多线程 小记
  • C++实现一个线程安全的单例工厂实现代码
  • c++实现简单的线程池
  • 浅析C++编程当中的线程
  • C++多线程编程时的数据保护
  • c++线程池实现方法
  • c++实现简单的线程池
  • C++多线程编程简单实例
  • C++封装远程注入类CreateRemoteThreadEx实例
  • C++封装线程类的实现方法

相关文章

  • 2017-05-28深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)
  • 2017-05-28C++实现将一个字符串中的字符替换成另一个字符串的方法
  • 2017-05-28C语言格式化输入输出函数详解
  • 2017-05-28C++基本算法思想之递推算法思想
  • 2017-05-28c语言 汉诺塔算法代码
  • 2017-05-28C++ 动态创建按钮及 按钮的消息响应
  • 2017-08-17可变参数函数
  • 2017-05-28C++中Semaphore内核对象用法实例
  • 2017-05-28详解C++中对构造函数和赋值运算符的复制和移动操作
  • 2017-05-28在c和c++中实现函数回调

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • HDOJ 1443 约瑟夫环的最新应用分析详解
    • VC++实现通过API来查看程序错误信息的方法
    • C语言创建和操作单链表数据结构的实例教程
    • 浅谈关于指针作为参数并改变它的值的问题
    • c++实现简单的线程池
    • VC实现让关闭按钮成灰色不可用的方法
    • 简单谈谈C++中指针与引用的区别
    • C语言中free函数的使用详解
    • C语言指针变量的定义和使用(精华)
    • C++继承中的访问控制实例分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有