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< 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
热门推荐
10 祝女儿简短祝福语大全
11 大学新年祝福语简短创意
12 元旦适合的祝福语简短
13 朋友出远门祝福语简短
14 初六简短的祝福语
15 祝男孩生日祝福语简短
16 同事调离的祝福语简短
17 拜年红包的祝福语简短
18 妈妈生日祝福语简短励志