【转】Mutex使用方法(精辟)
Mutex物件的做法与特性如下:
使用CreateMutex()来产生一个Mutex物件,而传入的Mutex名称字串用以区别不同的Mutex ,也就是说,不管是哪个Process/Thread,只要传入的名称叁数是相同的一个字串,那 CreateMutex()传回值(hMutex, handle of Mutex)会指向相同的一个Mutex物件。这和 Event物件相同。然而Mutex和Event有很大的不同,Mutex有Owner的概念,如果Mutex为 ThreadA所拥有,那麽ThreadA执行WaitForSingleObject()时,并不会停下来,而会立即 传回WAIT_OBJECT_0,而其他的Thread执行WaitForSingleObject()则会停下来,直到Mutex 的所有权被Release出来或Time Out。而Thread如何取得Mutex的所有权呢?主要如下:
1.CreateMutex(Byval 0, 1, "MyMutex") 第二个叁数传1进去,则第一个呼叫CreateMutex 且第二个叁数传1的Thread会拥有该Mutex。但如果第二个叁数传0进去,那代表 CreateMutex时,没有人拥有该Mutex。 2.承上的说明,如果Mutex没有拥有者,则第一个呼叫WaitForSingleObject的Thread 会拥有该Mutex。
上面说过,只有拥有该Mutex的Thread在执行WaitForSingleObject()不会停下来,其他的 Thread则会停下来,那其他的Thread如何取得该Mutex的所有权呢?那必需是原先拥有该 Mutex的Thread以ReleaseMutex来放弃所有权,一旦所有权放出来,而有其他的Thread处 於WaitForSingleObject()的停留等待状态,则有一个Thread会即时取得该Mutex的所有权 (上面第2点的说明),所以,若其他的Thread也执行WaitForSingleObject()时,就会处於 等待的状态。正因WaitForSingleObject()会令Mutex处於UnSignal的状态(和Event不同), 所以可以完成同一时问只有一个thread来UpDate共用记忆体的需求(当然大家都要使用Mutex 的规则则来做,即想Update时,要使用WaitForSingleObject()来看看是否可取得Mutex的所 有权。)
另有一件事要特别提出,如果一个Thread已取得Mutex的所有权,而它呼叫WaitForSingleObject() n 次,则也要使用ReleaseMutex n次才能够将Mutex的拥有权放弃,这和Event也不同,而 且,非Mutex拥有者呼叫ReleaseMutex也不会有任何作用。而每次以WaitForSingleObject 呼叫一次,Mutex会有一个计数器会加一,ReleaseMutex成功会减一,直到Mutex的计数 器为0之後,系统才会将之去除。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ren062/archive/2008/10/13/3071034.aspx