1. 程式人生 > >Windows程式設計--互斥量Mutex操作函式

Windows程式設計--互斥量Mutex操作函式

Windows程式設計–互斥量Mutex操作函式

常用操作mutex的函式有:ReleaseMutex / OpenMutex / WaitForSingleObject / WaitForMultipleObjects。

CreateMutex函式

CreateMutex作用是找出當前系統是否已經存在指定程序的例項。如果沒有則建立一個互斥體

CreateMutex()函式可用來建立一個有名或無名的互斥量物件,其函式原型為:

VB宣告

Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As
SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long

VC宣告

HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全屬性的指標
BOOLbInitialOwner, // 初始化互斥物件的所有者
LPCTSTRlpName // 指向互斥物件名的指標
);

返回值

Long,如執行成功,就返回互斥體物件的控制代碼;零表示出錯。會設定GetLastError。如果返回的是一個有效控制代碼,但指定的名字已經存在,GetLastError也會設為ERROR_ALREADY_EXISTS,bInitialOwner的值將會被忽略。如果呼叫者限制了許可權,GetLastError將會返回ERROR_ACCESS_DENIED,這個時候應該使用OpenMutex函式。

引數表

引數 型別及說明

lpMutexAttributes SECURITY_ATTRIBUTES,指定一個SECURITY_ATTRIBUTES結構,或傳遞零值(將引數宣告為ByVal As Long,並傳遞零值),表示使用不允許繼承的預設描述符

bInitialOwner BOOL,如建立程序希望立即擁有互斥體,則設為TRUE。一個互斥體同時只能由一個執行緒擁有

lpName String,指定互斥體物件的名字。用vbNullString建立一個未命名的互斥體物件。如已經存在擁有這個名字的一個事件,則開啟現有的已命名互斥體。這個名字可能不與現有的事件、訊號機、可等待計時器或檔案對映相符

OpenMutex函式

OpenMutex函式為現有的一個已命名互斥體物件建立一個新控制代碼。

函式功能:

函式原型:

HANDLE OpenMutex(
DWORD dwDesiredAccess, // access
BOOL bInheritHandle, // inheritance option
LPCTSTR lpName // object name
);

引數:

dwDesiredAccess:

MUTEX_ALL_ACCESS 請求對互斥體的完全訪問

MUTEX_MODIFY_STATE 允許使用 ReleaseMutex 函式

SYNCHRONIZE 允許互斥體物件同步使用

bInheritHandle : 如希望子程序能夠繼承控制代碼,則為TRUE

l**pName** :要開啟物件的名字

返回值:如執行成功,返回物件的控制代碼;零表示失敗。若想獲得更多錯誤資訊,請呼叫GetLastError函式。

備註:一旦不再需要,注意一定要用 CloseHandle 關閉互斥體控制代碼。如物件的所有控制代碼都已關閉,那麼物件也會刪除

速查:Windows NT/2000/XP:3.1以上版本;Windows 95/98/Me:95以上版本:

標頭檔案:Windows.h ;庫檔案:Kernel32.lib。

DLL:Kernel32.dll.

ReleaseMutex函式

ReleaseMutex是一種線性指令,具有釋放執行緒擁有的互斥體的控制權。

說明

ReleaseMutex函式的功能是釋放互斥物件的控制權

函式原型

BOOL WINAPI ReleaseMutex(

HANDLE hMutex

);

返回值

BOOL,TRUE表示成功,FALSE表示失敗。

引數表

hMutex:HANDLE,制定一個互斥體的控制代碼。

註釋

一個執行緒釋放了互斥物件的控制權後,如果其他程序在等待互斥物件置位,則等待的執行緒可以得到該互斥物件,等待函式返回,互斥物件被新的執行緒所擁有。