2013年3月29日 星期五

CreateMutex建立多線程互斥機制---解決行程同步問題

最近工作上需要修改單線程DLL讓成為多行程(Multi Processes)非多執行緒(Multi Thread),讓多執行檔對單一DLL同時進行存取,在可存取資源只有一個的情況下,又必須讓多行程(Multi Processes)同時執行且不相互衝突可用的資源,這就需要一個機制來達成,那就是使用互斥,讓多個執行檔在使用單一DLL時,只有一個行程可以使用。
單行程執行

每個行程都可以去使用單一資源,不會有一個以上的行程同時去使用同一個資源的問題發生,一個行程使用完資源後會將該資源的使用全交由下一個行程使用,不會有相互衝突的問題發生,所以可說是相安無事。

多行程執行

每個行程都要使用單一資源,因為有一個以上的行程同時執行並且同時使用同一資源,將會發生資源無法分配的問題,造成行程間搶資源的競賽,就是誰先搶到誰先執行,沒搶到資源的行程執行就會失敗。
基於上述問題,要讓多行程同時執行不會發生資源互搶競賽,又能到每個行程順利執行結束,這就需要使用互斥機制Mutex來解決行程同步的問題。
在VC++中提供有Critical Section、Mutex、Event等方法可以解決行程同步問題,這裡介紹有 CreateMutex使用方法,參考如下程式碼:
Handle hMutex = NULL;

//第二個參數,TRUE表示建立佔有Mutex使用權,FALSE表示建立者不佔有Mutex使用權
hMutex = CreateMutex(NULL,FALSE,"MyMutex"); //建立Mutex
WaitForSingleObject(hMutex,INFINITE); //取得Mutex使用權限並等待使用被釋放

//......Critical section protected code here(臨界區間)

ReleaseMutex(hMutex); //釋放使用使用權,讓其他執行續或行程進入critical section

沒有留言:

張貼留言