CreateMutex Creates or opens a named or unnamed mutex object.
同步問題 Mutex的使用
請先看 同步問題 Event的使用
如同使用Event的文章所述,如果兩個以上的Thread,同時想修改數個共用的記憶體,那
我們要保證同時之間,只有一個Thread可做Update的動作,而且要等該Thread完成所有
修改後,其他的Thread才可以讀取或修改;這便要使用Mutex物件的技術了。Mutex的作法
可以想像,大家都想做某件事前,要先取得一個許可金牌才能做,等做完了才將這金牌
Release出來,其他人只能一直等,直到取得金牌的擁有權後,方能做事。
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之後,系統才會將之去除。
請先看 同步問題 Event的使用
如同使用Event的文章所述,如果兩個以上的Thread,同時想修改數個共用的記憶體,那
我們要保證同時之間,只有一個Thread可做Update的動作,而且要等該Thread完成所有
修改後,其他的Thread才可以讀取或修改;這便要使用Mutex物件的技術了。Mutex的作法
可以想像,大家都想做某件事前,要先取得一個許可金牌才能做,等做完了才將這金牌
Release出來,其他人只能一直等,直到取得金牌的擁有權後,方能做事。
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之後,系統才會將之去除。
No comments:
Post a Comment