天天看點

Win32線程同步 - 互斥器

#include <iostream>
	#include <windows.h>
	#include <stdlib.h>
	
	using namespace std;
	
	HANDLE g_hMutex = NULL;
	const int g_Number = 3;
	
	DWORD WINAPI ThreadProc1(__in LPVOID lpParameter);
	DWORD WINAPI ThreadProc2(__in LPVOID lpParameter);
	DWORD WINAPI ThreadProc3(__in LPVOID lpParameter);
	
	int main()
	{
		// 建立互斥器
		g_hMutex = CreateMutex(NULL, FALSE, NULL);	// FALSE代表目前沒有線程擁有這個互斥對象
	
		HANDLE hThread[g_Number] = { 0 };
		int first = 1;
		int second = 2;
		int third = 3;
	
		// 建立工作線程
		hThread[0] = CreateThread(NULL, 0, ThreadProc1, (LPVOID)first, 0, NULL);
		hThread[1] = CreateThread(NULL, 0, ThreadProc2, (LPVOID)second, 0, NULL);
		hThread[2] = CreateThread(NULL, 0, ThreadProc3, (LPVOID)third, 0, NULL);
	
		// 線程handle引用計數減1
		CloseHandle(hThread[0]);
		CloseHandle(hThread[1]);
		CloseHandle(hThread[2]);
	
		// 主線程等待多個工作線程
		WaitForMultipleObjects(g_Number, hThread, TRUE, INFINITE);
	
		system("pause");
	
		// 關閉互斥器(核心對象)
		CloseHandle(g_hMutex);
	
		return 0;
	}
	
	DWORD WINAPI ThreadProc1(__in LPVOID lpParameter)
	{
		WaitForSingleObject(g_hMutex, INFINITE);		// 等待互斥量
		cout << (int)lpParameter << endl;
		ReleaseMutex(g_hMutex);					// 釋放互斥量
		return 0;
	}
	
	DWORD WINAPI ThreadProc2(__in LPVOID lpParameter)
	{
		WaitForSingleObject(g_hMutex, INFINITE);		
		cout << (int)lpParameter << endl;        
		ReleaseMutex(g_hMutex);                 
		return 0;
	}
	
	DWORD WINAPI ThreadProc3(__in LPVOID lpParameter)
	{
		WaitForSingleObject(g_hMutex, INFINITE);		
		cout << (int)lpParameter << endl;
		ReleaseMutex(g_hMutex);					
		return 0;
	}
           

繼續閱讀