一:介绍
事件Event实际上是个内核对象,事件分两种状态:激发状态和未激发状态。分两种类型:手动处置事件和自动处置事件。
手动处置事件被设置为激发状态后,会唤醒所有等待的线程,一直保持为激发状态,直到把它设置为未激发状态。
自动处置事件被设置为激发状态后,会唤醒一个等待中的线程,然后会自动设置成未激发状态。
二:函数说明
创建事件对象:
HANDLE CreateEvent
(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
BOOL bManualReset, // 指定将事件对象创建成手动复原还是自动复原,true:手动事件;false:自动事件
BOOL bInitialState, // 初始状态,true:有信号状态; false:无信号状态
LPCTSTR lpName // 事件对象名称
);
获得事件对象:
DWORD WaitForSingleObject(
HANDLE hHandle, //事件对象的句柄
DWORD dwMilliseconds //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
}
触发事件:
BOOL SetEvent(HANDLEhEvent)
将事件设置成未触发:
BOOL ResetEvent(HANDLEhEvent);
三:步骤
自动处置事件步骤:
1.声明事件对象:Handle hEvent
2.创建事件对象:CreateEvent(NULL, FALSE, TRUE, NULL)
3.使用事件对象:WaitForSingleObject(hEvent, INFINITE)
4.重置事件对象:SetEvent(hEvent)
5.销毁事件对象:CloseHandle(hEvent)
手动处置事件步骤:
1.声明事件对象:Handle hEvent
2.创建事件对象:CreateEvent(NULL, TRUE, TRUE, NULL)
3.使用事件对象:WaitForSingleObject(hEvent, INFINITE)
4.重置为未激活:ResetEvent(hEvent)
5.重置为激活态:SetEvent(hEvent)
5.销毁事件对象:CloseHandle(hEvent)
四:自动处置事件代码实现
/********************************************************
Copyright (C), 2016-2018,
FileName: t13
Author: woniu201
Email: wangpengfei.201@163.com
Created: 2018/10/23
Description: 线程同步-事件
********************************************************/
#include <iostream>
#include <Windows.h>
using namespace std;
volatile int number = 1;
HANDLE hEvent;
DWORD CALLBACK ThreadFun1(LPVOID pParam)
{
while (1)
{
WaitForSingleObject(hEvent, INFINITE);
cout << "Thread1:" << number++ << endl;
SetEvent(hEvent);
if (number >= 1000)
{
break;
}
}
return 0;
}
DWORD CALLBACK ThreadFun2(LPVOID pParam)
{
while (1)
{
WaitForSingleObject(hEvent, INFINITE);
cout << "Thread2:" << number++ << endl;
SetEvent(hEvent);
if (number >= 1000)
{
break;
}
}
return 0;
}
int main()
{
//创建自动事件
hEvent = CreateEvent(NULL, false, true, NULL);
CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
getchar();
return 1;
}
欢迎加群交流:C/C++开发交流