class Singleton{
private:
Singleton() {}
static Singleton *m_pInstance;
public:
static Singleton *GetInstance()
{
if(m_pInstance == null)
m_pInstance = new Singleton();
return m_pInstance;
}
}
class Lock
{
private:
CCriticalSection m_cs;
public:
Lock(CCriticalSection cs):m_cs(cs)
{
m_cs.Lock();
}
~Lock()
{
m_cs.UnLock();
}
}
class Singleton
{
private:
Singleton();
Singleton(const Singleton &);
Singleton &operator=(const Singleton&);
public:
static Singleton *Instantialize();
static Singleton *pInstance;
static CCriticalSection cs;
}
Singleton* Singleton::pInstance = 0;
Singleton* Singleton::Instantialize()
{
if(pInstance == NULL)
{ //double check
Lock lock(cs);
if(pInstance == NULL)
{
pInstance = new Singleton();
}
}
return pInstance;
}