class Singleton { public: ~Singleton(); static Singleton* GetInstance(); private: Singleton(); static Singleton* m_pInstance; static pthread_mutex_t s_initLock; class Deletor { public: ~Deletor() { if (Singleton::m_pInstance) { delete Singleton::m_pInstance; Singleton::m_pInstance = NULL; } } }; static Deletor s_deletor; }; Singleton* Singleton::m_pInstance; pthread_mutex_t Singleton::s_initLock = PTHREAD_MUTEX_INITIALIZER; Singleton::Deletor Singleton::s_deletor; Singleton::Singleton() { } Singleton::~Singleton() { } Singleton* Singleton::GetInstance() { if (!m_pInstance) { pthread_mutex_lock(&s_initLock); if (!m_pInstance) { m_pInstance = new Singleton; } pthread_mutex_unlock(&s_initLock); } return m_pInstance; }