C++实现一个线程安全的单例工厂实现代码
2017-05-19 16:54
786 查看
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++实现一个线程安全且高效单例类。(懒汉与饿汉)
- 一个利用windows api控制放音音量和录音麦克风音量实现类(c++代码)
- C++实现一个简单的双线程MVC框架
- 一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题
- 两个栈来实现一个队列的C++代码
- 编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。
- Linux C++ 一个线程池的简单实现(附代码)
- 用c++11的bind,function,boost::condition_variable实现的一个线程安全的任务队列
- 《剑指offer》:[6]两个栈实现一个队列的C++代码实现
- 两个栈来实现一个队列的C++代码(某公司社会早笔试题)
- C++ 实现的线程安全的单例模式类
- 考虑线程安全但效率不高的单例C++代码
- 基于C++实现的线程休眠代码
- 一个Windows C++的线程类实现
- 《大话设计模式》读书笔记(C++代码实现) 第一章:简单工厂模式
- 我实现的一个MD5代码,C/C++版本
- 《大话设计模式》读书笔记(C++代码实现) 第一章:简单工厂模式
- 用C++实现一个自动注册的工厂