代码改变世界

使用事件(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