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

猜你喜欢

转载自blog.csdn.net/u012967763/article/details/82844048