1. 程式人生 > >C++多執行緒--執行緒同步事件

C++多執行緒--執行緒同步事件

1、事件

事件是核心物件,多用於執行緒間通訊,可以跨程序同步

2、事件使用

  (1)建立事件

           HANDLE CreateEvent(

           LPSECURITY_ATTRIBUTE SlpEventAttributes,//安全控制,一般直接傳入NULL

           BOOL bManualReset,//確定事件是手動還是自動

          BOOL bInitialState,//事件的初始狀態

           LPCTSTR lpName//事件的名稱

        );

  (2)開啟事件

         HANDLE OpenEvent(

         DWORD dwDesiredAccess,//表示訪問許可權

         BOOL bInheritHandle,      //事件控制代碼繼承性

         LPCTSTR lpName     //名稱

         );

   (3)觸發事件

         BOOL SetEvent(HANDL EhEvent);

    (4)設定未觸發

          BOOL ResetEvent(HANDL EhEvent);

3、示例程式碼

#include <iostream>
#include <Windows.h>

using namespace std;

static int number = 10;

HANDLE event;

DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
	cout << "視窗1售票開始"<< endl;
	while (1)
	{
		WaitForSingleObject(event, INFINITE);
		if (number > 0)
		{
			cout << "視窗1售出第" << number << "張票" << endl;
			--number;
			Sleep(1000);
		}
		SetEvent(event);//設定事件為觸發狀態
	}
	return 0;
}

DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
	cout << "視窗2售票開始" << endl;
	while (1)
	{
		WaitForSingleObject(event, INFINITE);
		if (number > 0)
		{
			cout << "視窗2售出第" << number << "張票" << endl;
			--number;
			Sleep(1000);
		}
		SetEvent(event);
	}
	return 0;
}

int main()
{
	HANDLE HOne, HTwo;

	event = CreateEvent(NULL, FALSE, FALSE, NULL);

	SetEvent(event);

	HOne = CreateThread(NULL, 0, ThreadOne, NULL, 0, NULL);
	HTwo = CreateThread(NULL, 0, ThreadTwo, NULL, 0, NULL);

	

	CloseHandle(HOne);
	CloseHandle(HTwo);
	while (TRUE)
	{
		if (number == 0)
		{
			cout << "不好意思,票賣完了!" << endl;
			CloseHandle(event);
			return 0;
		}
		else
		{
			continue;
		}
	}
	system("Pause");
	return 0;
}