1. 程式人生 > >Win32執行緒同步

Win32執行緒同步

/*

*        說明:執行緒同步中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;
	}