Функция KeReleaseMutex (wdm.h)

Подпрограмма KeReleaseMutex освобождает объект мьютекса и указывает, будет ли вызывающий объект вызывать одну из подпрограмм KeWaitXxx , как только KeReleaseMutex возвращает элемент управления.

Синтаксис

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

Параметры

[in, out] Mutex

Указатель на инициализированный объект мьютекса, для которого вызывающий объект предоставляет хранилище.

[in] Wait

Указывает, должен ли за вызовом KeReleaseMutex немедленно следовать вызов одной из подпрограмм KeWaitXxx . Если задано значение TRUE, за вызовом KeReleaseMutex должен следовать вызов KeWaitForMultipleObjects, KeWaitForMutexObject или KeWaitForSingleObject. Дополнительные сведения см. в разделе "Примечания".

Возвращаемое значение

Если возвращаемое значение равно нулю, объект мьютекса был освобожден и достиг состояния сигналов.

Комментарии

Для повышения производительности используйте быстрые мьютексы или защищенные мьютексы. Дополнительные сведения см. в статье Альтернатива объектам мьютекса.

Если объект мьютекса достигает сигнального состояния, выполняется попытка удовлетворить ожидание объекта мьютекса.

Объект мьютекса может быть освобожден только потоком, который в настоящее время содержит мьютекс. Если предпринята попытка освободить мьютекс, который не хранится в потоке, или если мьютекс был получен в IRQL = DISPATCH_LEVEL и поток не выполняется в DISPATCH_LEVEL (и наоборот), подпрограмма вызывает исключение STATUS_ABANDONED или STATUS_MUTEX_NOT_OWNED.

Когда объект мьютекса достигает сигнального состояния, он удаляется из списка мьютексов, удерживаемых этим потоком. Если этот список больше не содержит записей, исходный приоритет потока восстанавливается.

Подпрограмма KeReleaseMutex может временно вызвать IRQL. Если параметр Wait имеет значение FALSE, подпрограмма перед возвратом восстанавливает irQL до исходного значения, которое было в начале вызова.

Если значение Wait = TRUE, подпрограмма возвращает без понижения значения IRQL. В этом случае за вызовом KeReleaseMutex должен следовать вызов KeWaitXxx . Установив значение Wait = TRUE, вызывающий объект может предотвратить ненужное переключение контекста между вызовом KeReleaseMutex и вызовом KeWaitXxx . Подпрограмма KeWaitXxx перед возвратом восстанавливает исходное значение IRQL в начале вызова KeReleaseMutex . Хотя IRQL отключает переключения контекста между двумя вызовами, эти вызовы нельзя надежно использовать в качестве начала и окончания атомарной операции. Например, между этими двумя вызовами поток, выполняющийся одновременно на другом процессоре, может изменить состояние объекта события или целевого объекта ожидания.

Если вызывающий объект выполняется в irQL = DISPATCH_LEVEL или в произвольном контексте потока, параметр Timeout для KeWaitXxx должен быть равен нулю.

Если мьютекс получается рекурсивно, удерживающий поток должен вызывать KeReleaseMutex столько раз, сколько он приобрел мьютекс, чтобы задать ему состояние сигналов.

Дополнительные сведения об объектах мьютексов см. в разделе Объекты мьютекса.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть 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