代码改变世界

使用Semaphore进行进程同步

2012-03-30 09:35  上帝之骰  阅读(702)  评论(0编辑  收藏  举报

  最近写一个小东西,要求六个进程之间同步。可以实现同步的方法由很多,最开始的想法是使用信号量来实现:建议一个控制进程,创建一个信号量,将最大资源计数设置为要同步的进程数,可用资源设置为0,而待同步进程则等待信号量的触发。

  首先做了一个小实验,一个控制进程,3个同步进程,信号量的最大资源计数为2,。这个实验只是验证下Semaphore的用法,代码如下,注意错误处理等都没有加入。

  控制进程: 

  HANDLE hSemaphore = CreateSemaphore(NULL, 0, 2, "Robots_Sync_Signal");

  //......After Certain Operations 

  if(!ReleaseSemaphore(hSemaphore, 2, &lPreCount))

    ......

 

  同步进程:

  HANDLE hSemaphore = OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE, FALSE, "Robots_Sync_Signal");

  WaitForSingleObject(hSemaphore, INFINITE);

  cout<<"Got Signal!"<<endl;

  //......After Certain Operations 

  if(!ReleaseSemaphore(hSemaphore, 1, &lPreCount))

    ......

  实验很成功,能观察到,在控制进程release信号量以后,两个同步进程取得信号量并执行,只有在这两个进程之一释放信号量以后,第三进程才能获取。

  需要注意的是打开信号量时的权限问题,如果OpenSemaphore时权限为NULL,则在XP下会打开失败,LastError为:Access Denied,必须明确地赋予权限。

  SYNCHRONIZE为等待函数WaitForSingleObject()需要的权限,而SEMAPHORE_MODIFY_STATE为ReleaseSemaphore()所需要的权限