#include "stdafx.h"
#include <windows.H>
#include <stdio.H>
#include <tchar.H>
#define LOOP_CNT 500000
int nData = 0;
CRITICAL_SECTION CriticalSection;
void Produce(int &nData)
{
nData++;
Sleep(0);
}
void Consume(int &nData)
{
nData--;
Sleep(0);
}
DWORD CALLBACK ProduceThread(void* arg)
{
int nCnt = 0;
BOOL bRun = TRUE;
while(TRUE == bRun)
{
EnterCriticalSection(&CriticalSection);
Produce(nData);
nCnt++;
if( LOOP_CNT == nCnt)
{
bRun = FALSE;
}
LeaveCriticalSection(&CriticalSection);
}
_tprintf(_T("ProduceThread %d\n"), nCnt);
return 0;
}
DWORD CALLBACK ConsumeThread(void* arg)
{
int nCnt = 0;
BOOL bRun = TRUE;
while(TRUE == bRun)
{
EnterCriticalSection(&CriticalSection);
Consume(nData);
nCnt++;
if( LOOP_CNT == nCnt)
{
bRun = FALSE;
}
LeaveCriticalSection(&CriticalSection);
}
_tprintf(_T("ConsumeThread %d\n"), nCnt);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[2] = {NULL};
InitializeCriticalSection(&CriticalSection);
DWORD startTime = GetTickCount();
hThread[0] = CreateThread(NULL, 0, ProduceThread, (LPVOID)0, 0, NULL);
hThread[1] = CreateThread(NULL, 0, ConsumeThread, (LPVOID)0, 0, NULL);
WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
_tprintf(_T("%d %d\n"), GetTickCount() - startTime, nData);
DeleteCriticalSection(&CriticalSection);
return 0;
}