1. 程式人生 > 實用技巧 >執行緒同步之事件物件

執行緒同步之事件物件

執行緒同步: 讓執行緒協同步調,按照一定的先後次序來執行

當人工重置的事件得到通知時,等待該事件的所有執行緒均變為可排程執行緒。
當一個自動重置的事件得到通知時,等待該事件的執行緒中只有一個執行緒變為可排程執行緒。

參考:
多執行緒與事件物件

#include <windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI Fun1Proc(
	LPVOID lpParameter   // thread data
	);

DWORD WINAPI Fun2Proc(
	LPVOID lpParameter   // thread data
	);

int tickets = 100;
HANDLE g_hEvent;

void main()
{
	HANDLE hThread1;
	HANDLE hThread2;
	hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
	hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
	CloseHandle(hThread1);
	CloseHandle(hThread2);

	g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);//自動的、無訊號狀態
	SetEvent(g_hEvent);//設定事件訊號為觸發
	Sleep(4000);

}

DWORD WINAPI Fun1Proc(
	LPVOID lpParameter   // thread data
	)
{
	while (TRUE)
	{
		WaitForSingleObject(g_hEvent, INFINITE);
		if (tickets>0)
		{
			Sleep(1);
			cout << "thread1 sell ticket : " << tickets << endl;
			tickets--;
		}
		else
			break;
		SetEvent(g_hEvent);
	}

	return 0;
}

DWORD WINAPI Fun2Proc(
	LPVOID lpParameter   // thread data
	)
{

	while (TRUE)
	{
		WaitForSingleObject(g_hEvent, INFINITE);
		if (tickets>0)
		{
			Sleep(1);
			cout << "thread2 sell ticket : " << tickets << endl;
			tickets--;
		}
		else
			break;
		SetEvent(g_hEvent);
	}

	return 0;
}