使用Semaphore进行进程同步
2012-03-30 09:35 上帝之骰 阅读(710) 评论(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()所需要的权限