Win32執行緒同步
阿新 • • 發佈:2018-12-14
/*
* 說明:執行緒同步中Event物件的使用
* 特點:核心物件
* 目的:成為激發或未激發狀態,兩種狀態完全由程式控制
* 執行狀態:
* 1. 執行緒編號的輸出沒有重複,說明主執行緒與子執行緒達到了同步。
* 2. 全域性資源的輸出是遞增的,說明各子執行緒已經互斥的訪問和輸出該全域性資源。
*/
#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; }