#include <stdio.h>
#include <process.h>
#include <windows.h>
#include <stdlib.h>
long g_nNum;
const int THREAD_NUM = 10;
// 事件和臨界區
HANDLE g_hThreadEvent;
CRITICAL_SECTION g_csThreadCode;
unsigned int __stdcall Fun(void *pPM);
int main()
{
printf("線程同步-事件Event\n");
// 初始化事件
g_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 初始化臨界區
InitializeCriticalSection(&g_csThreadCode);
HANDLE handle[THREAD_NUM];
g_nNum = 0;
int i = 0;
while (i<THREAD_NUM)
{
// 建立線程,等待事件觸發
handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);
WaitForSingleObject(g_hThreadEvent, INFINITE); // 等待事件被觸發
i++;
}
// 主線程等待工作線程結束
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
// 銷毀事件和臨界區
CloseHandle(g_hThreadEvent);
DeleteCriticalSection(&g_csThreadCode);
system("pause");
return 0;
}
unsigned int __stdcall Fun(void *pPM)
{
int nThreadNum = *(int *)pPM;
SetEvent(g_hThreadEvent); // 觸發事件,觸發後必定有一個或多個線程處于可執行狀态
Sleep(50); // 做點什麼
EnterCriticalSection(&g_csThreadCode);
g_nNum++;
Sleep(0); // 做點什麼
printf("線程編号為%d 全局資源值為%d\n", nThreadNum, g_nNum);
LeaveCriticalSection(&g_csThreadCode);
return 0;
}