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之後,系统才会将之去除。