天天看點

Win32線程同步 - 事件

#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;
	}
           

繼續閱讀