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小时内与您取得联系。