KeReleaseMutex 函式 (wdm.h)

KeReleaseMutex 例程會釋放 mutex 物件,並指定呼叫端是否要在 KeReleaseMutex 傳回控件時立即呼叫其中一個 KeWaitXxx 例程。

語法

LONG KeReleaseMutex(
  [in, out] PRKMUTEX Mutex,
  [in]      BOOLEAN  Wait
);

參數

[in, out] Mutex

呼叫端為其提供記憶體之已初始化 Mutex 物件的指標。

[in] Wait

指定 呼叫 KeReleaseMutex 是否要緊接著呼叫其中一個 KeWaitXxx 例程。 如果 為 TRUE則 KeReleaseMutex 呼叫後面必須接著呼叫 KeWaitForMultipleObjectsKeWaitForMutexObjectKeWaitForSingleObject。 如需詳細資訊,請參閱接下來的<備註>一節。

傳回值

如果傳回值為零,Mutex 物件已釋放並取得 已發出訊號的狀態。

備註

為了提升效能,請使用快速 Mutex 或受防護的 mutex。 如需詳細資訊,請參閱 Mutex 物件的替代方案

如果 mutex 對象達到訊號狀態,就會嘗試滿足 mutex 物件的等候。

Mutex 物件只能由目前保存 mutex 的線程釋放。 如果嘗試釋放線程未保留的 mutex,或在 IRQL = DISPATCH_LEVEL 取得 mutex,且線程未在DISPATCH_LEVEL (执行,反之亦然) ,則例程會引發STATUS_ABANDONED或STATUS_MUTEX_NOT_OWNED例外狀況。

當 Mutex 物件取得訊號狀態時,它會從該線程所持有的 Mutex 清單中移除。 如果此清單未再包含任何專案,則會還原線程的原始優先順序。

KeReleaseMutex 例程可能會暫時引發 IRQL。 如果 Wait 參數為 FALSE,則例程在傳回之前,會將 IRQL 還原至它在呼叫開始時所擁有的原始值。

如果 為 Wait = TRUE,則例程會傳回而不降低 IRQL。 在此情況下, KeReleaseMutex 呼叫必須緊接著 KeWaitXxx 呼叫。 藉由設定 Wait = TRUE,呼叫端可以防止 在 KeReleaseMutex 呼叫與 KeWaitXxx 呼叫之間發生不必要的內容切換。 KeWaitXxx 例程在傳回之前,會在 KeReleaseMutex 呼叫開始時,將 IRQL 還原為其原始值。 雖然 IRQL 會停用兩個呼叫之間的內容切換,但這些呼叫無法可靠地當做不可部分完成作業的開始和結束。 例如,在這兩個呼叫之間,在另一個處理器上同時執行的線程可能會變更事件物件或等候目標的狀態。

如果呼叫端在 IRQL = DISPATCH_LEVEL或在任意線程內容中執行,則 KeWaitXxxTimeout 參數必須是零。

如果以遞歸方式取得 mutex,保留線程必須呼叫 KeReleaseMutex ,只要取得 mutex,即可將其設定為已發出訊號的狀態。

如需 Mutex 物件的詳細資訊,請參閱 Mutex 物件

規格需求

需求
最低支援的用戶端 從 Windows 2000 開始提供。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIS (storport) IrqlKeDispatchLte (wdm)

另請參閱

ExReleaseFastMutex

ExReleaseFastMutexUnsafe

KeInitializeMutex

KeReadStateMutex

KeWaitForMultipleObjects

KeWaitForSingleObject