------解决方案--------------------
引用:这个问题看了很多网页,用了好几天的时间调试追踪,总算解决了,还是《Window核心编程》解释得比较清楚。
多个进程不同时刻是可以支配同一个mutex的。这里的关键是锁的所有者owner要说清楚:所有者不一定是创建者CreateMutex,而是加锁的进程,什么是加锁的进程?谁waitfor了,谁就加锁,就是该mutex当前的owner,必须由该进程Release。其它进程才能waitfor。关键是每个mutex个实例(object)中有一个数据成员,会记录它的owner。
A进程CreateMutex设置第2个BOOLbInitialOwner,//初始化互斥对象的所有者,则A相当于加锁,是该mutex当前的owner,释放后,其它进程才可以waitfor。如果CreateMutex第2个参数是false,则任何进程都可以waitfor,并立即成为该mutex的owner。
另外,一个进程如果是某mutex的owner,可以连续多次waitfor该锁,object中有一个成员计数。要注意的是,一次Release是解不开n次加锁的,可能会造成调试中的困扰。
所以呢,网友们的解释总是很模糊,可以是没有实际编程经历,或者是表达能力有问题。
在楼主发的这三个帖中学习到了,给楼主加关注了,很佩服楼主的这种精神,值得我学习,不过我还是没能看懂上面话的意思,我再体会体会。
------解决方案--------------------
引用:这个问题看了很多网页,用了好几天的时间调试追踪,总算解决了,还是《Window核心编程》解释得比较清楚。
多个进程不同时刻是可以支配同一个mutex的。这里的关键是锁的所有者owner要说清楚:所有者不一定是创建者CreateMutex,而是加锁的进程,什么是加锁的进程?谁waitfor了,谁就加锁,就是该mutex当前的owner,必须由该进程Release。其它进程才能waitfor。关键是每个mutex个实例(object)中有一个数据成员,会记录它的owner。
A进程CreateMutex设置第2个BOOLbInitialOwner,//初始化互斥对象的所有者,则A相当于加锁,是该mutex当前的owner,释放后,其它进程才可以waitfor。如果CreateMutex第2个参数是false,则任何进程都可以waitfor,并立即成为该mutex的owner。
另外,一个进程如果是某mutex的owner,可以连续多次waitfor该锁,object中有一个成员计数。要注意的是,一次Release是解不开n次加锁的,可能会造成调试中的困扰。
所以呢,网友们的解释总是很模糊,可以是没有实际编程经历,或者是表达能力有问题。
所以还是因为参数的原因影响了谁获取到mutex才造成了一系列问题。
------解决方案--------------------
我总觉得这是理所当然的事,没想到可能有些人理解会出现歧义.
这让我明白一个理:
你认为简单的事,可能对别人是复杂的事.别觉得别人笨,可能只是理解上的一些差别。
你认为复杂的事,可能对别人是简单的事.别觉得自己笨,可能只是理解上的一些差别。
------解决方案--------------------
引用:Quote: 引用:
同名的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。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-24256-2.html
日本海军联合舰队总吨位是超过北洋舰队的
甚至对我们示好