使⽤Semaphore进⾏进程同步
最近写⼀个⼩东西,要求六个进程之间同步。可以实现同步的⽅法由很多,最开始的想法是使⽤信号量来实现:建议⼀个控制进程,创建⼀个信号量,将最⼤资源计数设置为要同步的进程数,可⽤资源设置为0,⽽待同步进程则等待信号量的触发。
雪山岩 ⾸先做了⼀个⼩实验,⼀个控制进程,3个同步进程,信号量的最⼤资源计数为2,。这个实验只是验证下Semaphore的⽤法,代码如下,注意错误处理等都没有加⼊。
控制进程:
HANDLE hSemaphore = CreateSemaphore(NULL, 0, 2, "Robots_Sync_Signal");
红包祝福语格式 //......After Certain Operations
if(!ReleaSemaphore(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(!ReleaSemaphore(hSemaphore, 1, &lPreCount))
乔迁请帖>百寿图书法 ......
实验很成功,能观察到,在控制进程relea信号量以后,两个同步进程取得信号量并执⾏,只有在这两个进程之⼀释放信号量以后,第三进程才能获取。
需要注意的是打开信号量时的权限问题,如果OpenSemaphore时权限为NULL,则在XP下会打开失败,LastError为:Access Denied,必须明确地赋予权限。蛙泳视频教程
SYNCHRONIZE为等待函数WaitForSingleObject()需要的权限,⽽SEMAPHORE_MODIFY_STATE为ReleaSemaphore()所需要的权限
>孤独寂寞图片