使用事件(Event)进行进程同步
2012-03-30 10:00 上帝之骰 阅读(755) 评论(0) 编辑 收藏 举报前一篇文章写了使用信号量进行进程同步,不过很显然,信号量更适合用于资源控制的场合,如果单纯为了进行同步控制,使用事件(Event)更加简洁和方便。
事件的控制比信号量更为简单,没有最大资源计数和当前资源计数的属性,而只有是否触发这一属性,直接贴代码:
控制进程:
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, "Robots_Sync_Signal");
//......某些操作
SetEvent(hEvent);
同步进程:
HANDLE hEvent = OpenEvent(SYNCHRONIZE, FALSE, "Robots_Sync_Signal");
if(hEvent != NULL)
cout<<"Event Openned!"<<endl;
else
{
cout<<"Error Openning Event"<<endl;
cout<<"Last Error: "<<GetLastError()<<endl;
cin>>ch;
exit(0);
}
WaitForSingleObject(hEvent, INFINITE); //等待信号量触发
cout<<"Got Event!"<<endl;
//......同步以后的操作
//Close Event Handle
CloseHandle(hEvent);
注意,这里打开事件内核对象的时候,权限只用了SYNCHRONIZE,这是因为同步进程只需要等待触发,而不需要释放资源,或者对事件做处理。当然,如果需要Set或Reset事件,也是可以的,只要增加EVENT_MODIFY_STATE权限即可。
关于内核对象的访问权限,见MSDNhttp://msdn.microsoft.com/zh-cn/library/ms686670(v=vs.85).aspx