1. 饿汉模式
class Singleton { private: static Singleton instance; Singleton(){std::cout<<"construct "<<std::endl;} Singleton(const Singleton&); public: ~Singleton(){std::cout<<"destroy"<<std::endl;}; static Singleton* GetSingleton() { return &instance; } Singleton Singleton::instance;2.饿汉模式 a.局部静态变量的创建是线程安全的。
class SingletonB { public: static SingletonB* getinstance() { static SingletonB instance; return &instance; } private: SingletonB(){}; SingletonB(const SingletonB&); };b.加锁
class SingletonC { private: SingletonC(){cout<<"construct"<<endl;} SingletonC(const SingletonC&); static SingletonC* instance; public: static SingletonC* getinstance() { if(instance==0) { unique_lock<mutex>guard(m); instance=new SingletonC(); } return instance; } }; SingletonC* SingletonC::instance=0;c.利用pthread_once()函数
class SingletonD { private: SingletonD(){cout<<"construct"<<endl;} SingletonD(const SingletonC&); static SingletonD* instance; static pthread_once_t ponce_; static void init() { instance=new SingletonD(); } public: static SingletonD* getinstance() { pthread_once(&ponce_,&init); } }; pthread_once_t SingletonD::ponce_ = PTHREAD_ONCE_INIT; SingletonD*SingletonD:: instance=0;测试:
pthread_once_t once=PTHREAD_ONCE_INIT; class Singleton { public: static Singleton* getSingleton() { pthread_once(&once,init); return instance; } private: Singleton(){cout<<"construct";} Singleton(const Singleton&); static void init() { instance=new Singleton; } static Singleton* instance; }; Singleton* Singleton::instance=0; void func() { Singleton *s1=Singleton::getSingleton(); } int main() { thread t1(func),t2(func),t3(func),t4(func),t5(func); t1.join(); t2.join(); t3.join(); t4.join(); t5.join(); return 0; }结果:
