#include <iostream>
#include <vector>
#include <bitset>
#include <assert.h>
#include <Windows.h>
#include <process.h>
using namespace std;
class CSingleton
{
private:
class CAssistForSingleton
{
private:
CRITICAL_SECTION m_cs;
public:
CAssistForSingleton()
{
InitializeCriticalSection(&m_cs);
}
~CAssistForSingleton()
{
DeleteCriticalSection(&m_cs);
}
public:
void Lock()
{
EnterCriticalSection(&m_cs);
}
void UnLock()
{
LeaveCriticalSection(&m_cs);
}
};
private:
static CAssistForSingleton m_refSycObj;
static CSingleton *m_pInstance;
static int m_nData;
private:
CSingleton()
{
}
public:
static CSingleton *GetInstatnce()
{
m_refSycObj.Lock();
if (NULL == m_pInstance)
{
m_pInstance = new CSingleton;
cout<<"new CSingleton"<<endl;
}
m_refSycObj.UnLock();
return m_pInstance;
}
public:
static int GetData()
{
return m_nData;
}
static void SetData(int nData)
{
m_refSycObj.Lock();
m_nData = nData;
m_refSycObj.UnLock();
}
};
CSingleton::CAssistForSingleton CSingleton::m_refSycObj = CSingleton::CAssistForSingleton();
CSingleton *CSingleton::m_pInstance = NULL;
int CSingleton::m_nData = 0;
unsigned int WINAPI ThreadFun(void *)
{
cout<<"Launcher Thread"<<endl;
for(int i = 0 ; i < 99999999 ; i++)
{
CSingleton *pSingl = CSingleton::GetInstatnce();
if (NULL != pSingl)
{
pSingl->SetData(i);
}
Sleep(500);
}
return 0;
}
int main(int argv, char *argc[])
{
uintptr_t HandleThread[10];
unsigned int nThreadId = 0;
for(int i = 0 ; i < 10 ; i++)
{
HandleThread[i] = _beginthreadex(NULL, 0, ThreadFun, NULL, 0, &nThreadId);
}
WaitForMultipleObjects(10, (const HANDLE *)HandleThread, TRUE, INFINITE);
return 0;
}