事件,使用事件就需要获得事件的句柄。
事件的创建是用CreateObject(事件属性指针,
手动清除事件信号还是自动清除事件信号,True是手动,
事件的初始状态,false是事件为激发(就是没激发没发生),
事件的名称)。
返回事件的句柄。
激发一个事件用函数:setEvent(HANDLE hObject);
获取一个现存的事件:OpenEvent(EVENT_ALL_ACCESS, true, "MyEvevt");
设置三个线程,一个主线程,一个读线程和一个写线程,读线程必须在写线程写之后才能读,主线程必须在读线程读之后才能结束
实现:定义两个事件, evRead, evFinish;读线程等待evRead, 主线程等待evFinish.
//使用事件机制同步线程的例子
//设置三个线程,一个主线程,一个读线程和一个写线程,
//读线程必须在写线程写之后才能读,主线程必须在读线程读之后才能结束
/*
实现:定义两个事件, evRead, evFinish;读线程等待evRead, 主线程等待evFinish.
*/
#include <iostream>
#include <Windows.h>
#include <process.h>
using namespace std;
HANDLE evRead, evFinish;
void ReadThread(void* param){
//等待读事件
WaitForSingleObject(evRead, INFINITE);
//读操作
cout << "reading" << endl;
//激发事件evFinish
SetEvent(evFinish);
}
void WriteThread(void* param){
//写操作
cout << "writing" << endl;
//唤醒读事件
SetEvent(evRead);
}
int main()
{
//创建两个事件,并初始化为未激发状态
evRead = CreateEvent(NULL, false, false, NULL);
evFinish = CreateEvent(NULL, false, false, NULL);
//创建读线程和写线程
_beginthread(ReadThread, 0, NULL);
_beginthread(WriteThread, 0, NULL);
//等待事件evFinish
WaitForSingleObject(evFinish, INFINITE);
cout << "the program is end." << endl;
return 0;
}
运行结果如图: