继续多进程中CreateMutex与ReleaseMutex使用问题
我前面帖子询问多进程中CreateMutex与ReleaseMutex的问题。
?page=1
需要在多进程中使用,互斥锁控制共享内存。
hMutex=CreateMutex(NULL,TRUE,“ReadWrite11”);
如果该语句在主进程中,子进程无法ReleaseMutex(hMutex),因为谁创建,谁才能释放。
最后我在子进程A中创建,子进程A自然可以释放,主进程可以waifor该信号。问题来了:
因为有多个子进程,子进程B中用下吗语句得到的是同一个锁,却无法ReleaseMutex(hMutex),
hMutex=CreateMutex(NULL,TRUE,“ReadWrite11”);
改为OpenMutex同样没有释放权。
那么微软设计的这个互斥根本无法在3个以上进程中使用?
这是多进程,不是多线程。请对多进程有实际经验的朋友指导。
------解决方案--------------------
同名的mutex最多只允许一个thread获取owner。所有不管多少进程或线程在等待同一个mutex,只有一个允许运行。
按你的例子:一个进程(假设主进程)CreateMutex(NULL,TRUE,“ReadWrite11”)成功,GetLastError==0,那么返回的handle已经被这个进程拥有了,其它进程(不管多少,假设是子进程)同样CreateMutex(NULL,TRUE,“ReadWrite11”),如果成功返回了handle,并且GetLastError==ERROR_ALREADY_EXISTS,这个进程并不拥有这个mutex,但是你可以用wait系列函数等待拥有者释放它。此时主进程调用ReleaseMutex释放拥有权,等待的某个进程可以获取这个mutex,如果主进程又一次希望拥有这个mutex,那么主进程可以用wait系列函数等待拥有这个mutex的子进程调用ReleaseMutex。
因此,谁获取了mutex谁负责调用ReleaseMutex,否则其它进程/线程无法再次拥有它。
CreateMutex后WaitFor.../ReleaseMutex相当于lock/unlock操作。
------解决方案--------------------
每个进程都一样吧
h=OpenMutex(...);
if(h==0)
h=CreateMutex(...);
......
//todo
ReleaseMutex(...);
有什么问题吗?
------解决方案--------------------
我也一直在关注楼主的这个问题,上个帖子我也跟了。
楼主想做进程间互斥能不能换个思路:
思路1:
是否可以使用两个mutex,例如:进程A创建Mutex为MA,进程B创建Mutex为MB;进程A等待进程B创建的MB,进程B等待进程A创建的MA;让两进程都处于等待状态,当某个时机需要触发时ReleaseMA或MB;
楼主按这个思路想想,可以先解决你的问题。
但感觉还是不太好:
1、多个进程交互起来就有点麻烦了;(通过逻辑处理可以实现)
2、感觉这是一个回避的办法,从本质上根本没解决这个问题;
3、玩不好的话容易出现死锁;
思路2:
不使用mutex,使用Event是否可以代替,在多个进程SetEvent是没有问题的,这个我式过。
------解决方案--------------------
只能说楼主没有好好看msdn上的说明,initowner参数的解释还是很细的
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-24256-1.html
好吧我也来加油了
好像某米是高大上