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< 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!