该示例与上一篇的《手动重置事件+临界区实现线程间同步》的不同点就是事件的类型不同,并且不需要调用ResetEvent函数
#include <iostream>
#include <Windows.h>
using namespace std;
int g_count = 0;
HANDLE hEvent = NULL;
CRITICAL_SECTION g_cs;
DWORD WINAPI ThreadProc(PVOID pParam)
{
int nThreadNum = *(int *)pParam;
SetEvent(hEvent);
Sleep(50);
EnterCriticalSection(&g_cs);
++g_count;
cout << "线程编号为" << nThreadNum << " 全局资源为" << g_count << endl;
LeaveCriticalSection(&g_cs);
return 0;
}
int main(int argc, char *argv[])
{
hEvent = CreateEvent(0,FALSE,FALSE,0);// 创建自动重置事件
InitializeCriticalSection(&g_cs);
HANDLE hThreads[10];
for (int i = 0 ; i < 10 ; ++i)
{
hThreads[i] = CreateThread(0,0,ThreadProc,&i,0,0);
WaitForSingleObject(hEvent,INFINITE);
// 提示:这里并没有调用ResetEvent函数来重置事件的未触发状态
}
WaitForMultipleObjects(10,hThreads,TRUE,INFINITE);
for (int i = 0 ; i < 10 ; ++i)
{
CloseHandle(hThreads[i]);
}
DeleteCriticalSection(&g_cs);
CloseHandle(hEvent);
return 0;
}