C++实现一个线程安全的单例工厂实现代码
C++实现一个线程安全的单例工厂实现代码
我们见到经常有人用static局部对象的方式实现了类似单例模式,最近发现一篇文章明确写明编译器在处理 static局部变量的时候并不是线程安全的!!!
http://blogs.msdn.com/b/oldnewthing/archive/2004/03/08/85901.aspx
于是实现了一个单例工厂 并且是线程安全的
#ifndefSINGLETONFACTORY_H #defineSINGLETONFACTORY_H #include"windows.h" #includenamespaceTools { template classSingletonFactory { public: virtual~SingletonFactory() { ::DeleteCriticalSection(&__criticalSection); } std::auto_ptr &GetInstance(); staticSingletonFactory *CreateSingletonFactory(); private: SingletonFactory() { ::InitializeCriticalSection(&__criticalSection); } std::auto_ptr __singletonObj; CRITICAL_SECTION__criticalSection; }; //初始化创建后续在多线程中使用 //还有另一种写法是单独的函数直接返回内部单例包装静态成员在多线程情况下不安全 //SingletonFactory::CreateSingletonFactory().GetInstance(); template SingletonFactory *SingletonFactory ::CreateSingletonFactory(){ staticSingletonFactory temObj; return&temObj; } //工厂实例 template std::auto_ptr &SingletonFactory ::GetInstance() { if(__singletonObj.get()==0) { ::EnterCriticalSection(&__criticalSection); if(__singletonObj.get()==0) __singletonObj=std::auto_ptr (newT); ::LeaveCriticalSection(&__criticalSection); } return__singletonObj; } } #endif//SINGLETONFACTORY_H
测试代码
SingletonFactory*singleton1=SingletonFactory ::CreateSingletonFactory(); singleton1->GetInstance()->x=100; cout< GetInstance()->x< GetInstance()->y=200; cout< GetInstance()->x< GetInstance()->y< *singleton2=SingletonFactory ::CreateSingletonFactory(); singleton2->GetInstance()->x=100; cout< GetInstance()->x< GetInstance()->y=200; cout< GetInstance()->x< GetInstance()->y< 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
热门推荐
1 如何训练狗狗不叫
2 训练狗狗不叫
3 训练狗狗随行
4 怎么训练狗狗不叫
7 训练比熊狗狗教程
10 上海狗狗训练
11 怎么训练狗狗上厕所
12 训练狗狗趴下
13 狗狗服从训练
14 训练狗狗拒食
15 训练狗狗笑
16 训练狗狗大便
17 训练狗狗立
18 训练狗狗捡东西