事件

1.定义:简单地说,事件是主要在线程之间传递信号,通过事件来控制一个线程是处于执行状态还是处于挂起状态;

事件和互斥量还是有所区别的:
1.事件主要是用于协调两个或多个线程之间的动作,如:一个线程等待某个事件的发生,另一个事件则在某个事件发生后产生一个信号,通知正在等待的线程。而互斥量主要是保证在任一时刻只有一个线程在使用共享的资源,什么时刻运行哪个线程是随机的,是由操作系统决定的,用户没有决定权,所以互斥量不能使两个线程按一定的顺序执行;

2.有信号和无信号的含义不同;互斥量的有信号和无信号,对于互斥量来说,有信号状态是指有线程正在拥有该互斥量,其他线程不能获取该互斥量的权限,无信号则是没有线程拥有该互斥量,线程可以获得互斥量;对于事件而言,当等待的事件发生时,事件对象处于活动状态,此时事件对象处于有信号状态,相反等待时间没有发生时,则称其处于无信号状态;

事件分为:自动事件和手动事件。手动事件是指当事件对象处于活动状态时它会一直处于该状态,直到显示设置其为无信号状态为止;自动事件则是指当事件处于有信号状态并有一个线程接收到该事件后,事件立即变为无信号状态。

CreateEvent():创建一个事件;
OpenEvent():打开一个已创建的事件;
SetEvent():触发一个事件;
ResetEvent():复位一个事件;
PulseEvent():触发并重置一个事件;
WaitForSingleObject():等待某事件;
WaitforMultipleObjects():等待多个事件;

#include <process.h>
#include <iostream>
#include <Windows.h>
using namespace std;

HANDLE hEvent;
DWORD WINAPI Mythread1(LPVOID lp1)
{
   cout<<"wait for event "<<endl;
   WaitForSingleObject(hEvent,INFINITE);//得到事件触发信号后
   cout<<"Get the event"<<endl;
   return 1;
}

DWORD WINAPI Mythread2(LPVOID lp2)
{
Sleep(1000);
cout<<"signal the event"<<endl;//设置事件为有信号状态
SetEvent(hEvent);
return 1;
}

int main(int argc,char*argv[])
{
HANDLE hThread1,hThread2;
DWORD dw1,dw2;
hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件
hThread1 =CreateThread(NULL,0,Mythread1,NULL,0,&dw1);
hThread2=CreateThread(NULL,0,Mythread2,NULL,0,&dw2);
Sleep(6000);
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hEvent);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值