Поделиться через


Функция 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. Если параметр waitFALSE, подпрограмма перед возвратом восстанавливает IRQL до исходного значения, которое оно было в начале вызова.

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

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

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

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Windows 2000.
целевая платформа Всеобщий
заголовка wdm.h (include 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