Макрос 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) |