这篇文章主要介绍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" #includenamespace Tools { template class SingletonFactory { public: virtual ~SingletonFactory() { ::DeleteCriticalSection(&__criticalSection); } std::auto_ptr & GetInstance(); static SingletonFactory * CreateSingletonFactory(); private: SingletonFactory() { ::InitializeCriticalSection(&__criticalSection); } std::auto_ptr __singletonObj; CRITICAL_SECTION __criticalSection; }; //初始化创建 后续在多线程中使用 //还有另一种写法是单独的函数直接返回内部单例包装静态成员在 多线程情况下不安全 //SingletonFactory::CreateSingletonFactory().GetInstance(); template SingletonFactory * SingletonFactory ::CreateSingletonFactory(){ static SingletonFactory temObj; return &temObj; } //工厂实例 template std::auto_ptr & SingletonFactory ::GetInstance() { if(__singletonObj.get()==0) { ::EnterCriticalSection(&__criticalSection); if(__singletonObj.get()==0) __singletonObj=std::auto_ptr (new T); ::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< 以上是“C++如何实现一个线程安全的单例工厂”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联网站建设公司行业资讯频道!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享题目:C++如何实现一个线程安全的单例工厂-创新互联
文章URL:http://bjjierui.cn/article/cogijo.html