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


Макрос KeAcquireSpinLock (wdm.h)

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

Синтаксис

void KeAcquireSpinLock(
   SpinLock,
   OldIrql
);

Параметры

SpinLock

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

OldIrql

Указатель на переменную KIRQL, которая при этом вызове задается на текущий irQL.

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

None

Remarks

KeAcquireSpinLock сначала сбрасывает IRQL до DISPATCH_LEVEL, а затем получает блокировку. Предыдущий irQL записывается в OldIrql после получения блокировки.

Значение OldIrql должно быть указано при освобождении блокировки спина с помощью KeReleaseSpinLock.

Большинство драйверов используют локальную переменную для хранения старого значения IRQL. Драйвер также может использовать расположение общей памяти, например глобальную переменную, но драйвер не должен использовать одно и то же расположение для двух разных блокировок. В противном случае может возникнуть состояние гонки.

Спин-блокировки могут вызвать серьезные проблемы, если не использовать их разумно. В частности, защита от взаимоблокировки не выполняется, а диспетчеризация отключена во время блокировки спина. Таким образом:

  • Код в критической области, защищенной спин-блокировкой, не должен быть страничной и содержать ссылки на страничные данные.
  • Код в критической области, защищенной спин-блокировкой, не может ни вызывать внешнюю функцию, которая может обращаться к страничных данным или вызывать исключение, ни создавать исключения.
  • Вызывающий объект должен как можно быстрее освободить спин-блокировку с помощью KeReleaseSpinLock .
Попытка получить блокировку спина рекурсивно гарантированно вызовет взаимоблокировку. Дополнительные сведения о спиновых блокировках см. в разделе Спин-блокировки.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека Hal.lib
IRQL <= DISPATCH_LEVEL
Правила соответствия DDI HwStorPortProhibitedDIs(storport), IrqlKeDispatchLte(wdm), MarkingQueuedIrps(wdm), ReqSendTimeSpinlock(kmdf), Spinlock(kmdf), Spinlock(kmdf), SpinLock(storport), SpinLock(storport), SpinLock(wdm), SpinlockDpc(kmdf), SpinlockDpc(kmdf), SpinLockDpc(storport), SpinLockDpc(storport), SpinLockDpc(wdm), SpinlockRelease(kmdf), SpinlockRelease(kmdf), SpinLockRelease(storport), SpinLockRelease(storport), SpinlockRelease(wdm), SpinLockSafe(storport), SpinLockSafe(storport), SpinLockSafe(wdm)

См. также раздел

KeAcquireInStackQueuedSpinLock

KeAcquireSpinLockAtDpcLevel

KeInitializeSpinLock

KeReleaseSpinLock