CRITICAL_SECTION g_cs;
HANDLE g_hEvent1;
HANDLE g_hEvent2;
HANDLE g_hEvent3;
int g_nCount = 3;
int nPos = 0;
unsigned int __stdcall ThreadFun1(void* pM)
{
for(int i = 0; i < g_nCount; ++i)
{
WaitForSingleObject(g_hEvent3, INFINITE);
//ResetEvent(g_hEvent3);
EnterCriticalSection(&g_cs);
g_Data[nPos] = 1;
nPos++;
LeaveCriticalSection(&g_cs);
//
ReleaseSemaphore(g_hEvent1, 1, NULL);
//通知缓冲区已为空
//SetEvent(g_hEvent2);
}
return 0;
}
unsigned int __stdcall ThreadFun2(void* pM)
{
for(int i = 0; i < g_nCount; ++i)
{
WaitForSingleObject(g_hEvent1, INFINITE);
//ResetEvent(g_hEvent1);
EnterCriticalSection(&g_cs);
g_Data[nPos] = 2;
nPos++;
LeaveCriticalSection(&g_cs);
ReleaseSemaphore(g_hEvent2, 1, NULL);
//通知缓冲区已为空
//SetEvent(g_hEvent2);
}
return 0;
}
unsigned int __stdcall ThreadFun3(void* pM)
{
for(int i = 0; i < g_nCount; ++i)
{
WaitForSingleObject(g_hEvent2, INFINITE);
//ResetEvent(g_hEvent2);
EnterCriticalSection(&g_cs);
g_Data[nPos] = 3;
nPos++;
LeaveCriticalSection(&g_cs);
//通知缓冲区已为空
ReleaseSemaphore(g_hEvent3, 1, NULL);
//SetEvent(g_hEvent3);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
InitializeCriticalSection(&g_cs);
g_hEvent1 = CreateSemaphore(NULL, 0, 1, NULL);
g_hEvent2 = CreateSemaphore(NULL, 0, 1, NULL);
g_hEvent3 = CreateSemaphore(NULL, 1, 1, NULL);
HANDLE hThread[3];
hThread[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun1, NULL, 0, NULL);
hThread[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun2, NULL, 0, NULL);
hThread[2] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun3, NULL, 0, NULL);
WaitForMultipleObjects(3, hThread, TRUE, INFINITE);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(hThread[2]);
CloseHandle(g_hEvent1);
CloseHandle(g_hEvent2);
CloseHandle(g_hEvent3);
DeleteCriticalSection(&g_cs);