使用互斥量Mutex主要將用到四個函數。下面是這些函數的原型和使用說明。
第一個
CreateMutex
函數功能:建立互斥量(注意與事件Event的建立函數對比)
函數原型:
HANDLECreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes,
BOOLbInitialOwner,
LPCTSTRlpName
);
函數說明:
第一個參數表示安全控制,一般直接傳入NULL。
第二個參數用來確定互斥量的初始擁有者。如果傳入TRUE表示互斥量對象內部會記錄建立它的線程的線程ID號並將遞迴計數設定為1,由於該線程ID非零,所以互斥量處於未觸發狀態。如果傳入FALSE,那麼互斥量對象內部的線程ID號將設定為NULL,遞迴計數設定為0,這意味互斥量不為任何線程佔用,處於觸發狀態。mutex
有線程所有權的概念,如果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。
第三個參數用來設定互斥量的名稱,在多個進程中的線程就是通過名稱來確保它們訪問的是同一個互斥量。
函數訪問值:
成功返回一個表示互斥量的控制代碼,失敗返回NULL。
第二個開啟互斥量
函數原型:
HANDLEOpenMutex(
DWORDdwDesiredAccess,
BOOLbInheritHandle,
LPCTSTRlpName //名稱
);
函數說明:
第一個參數表示存取權限,對互斥量一般傳入MUTEX_ALL_ACCESS。詳細解釋可以查看MSDN文檔。
第二個參數表示互斥量控制代碼繼承性,一般傳入TRUE即可。
第三個參數表示名稱。某一個進程中的線程建立互斥量後,其它進程中的線程就可以通過這個函數來找到這個互斥量。
函數訪問值:
成功返回一個表示互斥量的控制代碼,失敗返回NULL。
第三個觸發互斥量
函數原型:
BOOLReleaseMutex (HANDLEhMutex)
函數說明:
訪問互斥資源前應該要調用等待函數,結束訪問時就要調用ReleaseMutex()來表示自己已經結束訪問,其它線程可以開始訪問了。
最後一個清理互斥量
由於互斥量是核心對象,因此使用CloseHandle()就可以(這一點所有核心對象都一樣)。