struct CParam
{
BOOL bActive;
int nCount;
CCriticalSection CriticalSection;
CParam();
};
CParam::CParam()
:bActive(TRUE)
,nCount(0)
{
}
DWORD WINAPI MyThread(LPVOID lpParameter)
{
CParam *pParam;
pParam = (CParam*)lpParameter;
pParam->bActive = TRUE;
while(1)
{
pParam->CriticalSection.Enter();
++pParam->nCount;
pParam->CriticalSection.Leave();
Sleep(1);
}
pParam->bActive = FALSE;
ExitThread(0);
}
void InitThread()
{
HANDLE hThread;
DWORD ThreadId;
CParam param;
hThread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread, (void*)¶m, 0, &ThreadId);
while(param.bActive == TRUE)
{
param.CriticalSection.Enter();
Sleep(100);
cout << param.nCount << "\n";
param.CriticalSection.Leave();
}
CloseHandle(hThread);
}
int _tmain(int argc, _TCHAR* argv[])
{
InitThread();
return 0;
}
CriticalSection enter 後. 做了sleep 100, 在這裡就能看到當資料被同步機制保護時, MyThread的執行緒是無法存取的! 必需等待main CriticalSection leave.要測試請在 cout << param.nCount 放中斷.
回覆刪除