Freigeben über


KeReleaseMutex-Funktion (wdm.h)

Die KeReleaseMutex Routine gibt ein Mutex-Objekt frei und gibt an, ob der Aufrufer eine der KeWaitXxx Routinen aufruft, sobald KeReleaseMutex die Steuerung zurückgibt.

Syntax

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

Parameter

[in, out] Mutex

Ein Zeiger auf ein initialisiertes Mutex-Objekt, für das der Aufrufer den Speicher bereitstellt.

[in] Wait

Gibt an, ob der Aufruf von KeReleaseMutex- sofort durch einen Aufruf eines der KeWaitXxx Routinen gefolgt werden soll. Wenn TRUE-, muss dem KeReleaseMutex-aufruf ein Aufruf von KeWaitForMultipleObjects, KeWaitForMutexObjectoder KeWaitForSingleObjectfolgen. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".

Rückgabewert

Wenn der Rückgabewert null ist, wurde das Mutex-Objekt losgelassen und ein Zustand von signalisierterreicht.

Bemerkungen

Um eine bessere Leistung zu erzielen, verwenden Sie schnelle Mutexe oder geschützte Mutexe. Weitere Informationen finden Sie unter Alternativen zu Mutex Objects.

Wenn das Mutex-Objekt einen signalisierten Zustand erreicht, wird versucht, eine Wartezeit für das Mutex-Objekt zu erfüllen.

Ein Mutex-Objekt kann nur vom Thread freigegeben werden, der derzeit den Mutex enthält. Wenn versucht wird, einen Mutex freizugeben, den der Thread nicht enthält oder wenn ein Mutex bei IRQL = DISPATCH_LEVEL abgerufen wurde und der Thread nicht bei DISPATCH_LEVEL ausgeführt wird (und umgekehrt), löst die Routine eine STATUS_ABANDONED- oder STATUS_MUTEX_NOT_OWNED Ausnahme aus.

Wenn ein Mutex-Objekt einen signalisierten Zustand erreicht, wird es aus der Liste der Mutexes entfernt, die von diesem Thread gehalten werden. Wenn diese Liste keine weiteren Einträge enthält, wird die ursprüngliche Priorität für den Thread wiederhergestellt.

Die KeReleaseMutex Routine kann die IRQL vorübergehend erhöhen. Wenn der parameter WaitFALSEist, stellt die Routine vor der Rückgabe die IRQL auf den ursprünglichen Wert zurück, den er am Anfang des Aufrufs hatte.

Wenn Wait = TRUE, gibt die Routine zurück, ohne die IRQL zu senken. In diesem Fall muss der KeReleaseMutex Anruf sofort einem KeWaitXxx Anruf folgen. Durch Festlegen von Wait = TRUEkann der Aufrufer verhindern, dass ein unnötiger Kontextwechsel zwischen dem KeReleaseMut ex-Aufruf und dem KeWait-Xxx--Aufruf erfolgt. Die KeWaitXxx Routine stellt vor der Rückgabe den IRQL-Wert am Anfang des KeReleaseMutex Aufrufs wieder her. Obwohl die IRQL Kontextwechsel zwischen den beiden Aufrufen deaktiviert, können diese Aufrufe nicht zuverlässig als Start- und Ende eines atomischen Vorgangs verwendet werden. Beispielsweise kann zwischen diesen beiden Aufrufen ein Thread, der gleichzeitig auf einem anderen Prozessor ausgeführt wird, den Status des Ereignisobjekts oder des Ziels der Wartezeit ändern.

Wenn der Aufrufer bei IRQL = DISPATCH_LEVEL oder in einem beliebigen Threadkontext ausgeführt wird, muss der Timeout Parameter KeWaitXxx- null sein.

Wenn ein Mutex rekursiv abgerufen wird, muss der Haltethread KeReleaseMutex so oft aufrufen, wie er den Mutex abgerufen hat, um ihn auf den signalierten Zustand festzulegen.

Weitere Informationen zu Mutex-Objekten finden Sie unter Mutex Objects.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Ab Windows 2000 verfügbar.
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= DISPATCH_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), IrqlKeDispatchLte(wdm)

Siehe auch

ExReleaseFastMutex

ExReleaseFastMutexUnsafe

KeInitializeMutex

KeReadStateMutex

KeWaitForMultipleObjects

KeWaitForSingleObject