b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

releasemutex_mutex同步_mutex代替event

电脑杂谈  发布时间:2017-01-01 22:00:38  来源:网络整理

继续多进程中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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...