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


Синхронизация и потоковые DPC

Для синхронизации доступа к расположению памяти, доступ к которому осуществляется как внутри, так и за пределами подпрограммы CustomThreadedDpc , драйвер может использовать обычные спин-блокировки или очереди. При этом драйвер должен соблюдать определенные правила для правильной синхронизации в IRQL = PASSIVE_LEVEL и в IRQL = DISPATCH_LEVEL, так как подпрограмма CustomThreadedDpc может выполняться в обоих irQLs.

Для обычной спин-блокировки применяются следующие правила:

  • Чтобы получить и освободить спин-блокировку, драйвер может вызывать KeAcquireSpinLock и KeReleaseSpinLock как внутри, так и за пределами подпрограммы CustomThreadedDpc .

  • Драйвер может вызывать KeAcquireSpinLockForDpc и KeReleaseSpinLockForDpc из подпрограммы CustomThreadedDpc . Обратите внимание, что подпрограмма CustomThreadedDpc не должна вызывать KeAcquireSpinLockAtDpcLevel или KeReleaseSpinLockFromDpcLevel, так как эти подпрограммы можно безопасно вызывать только в IRQL = DISPATCH_LEVEL.

Правила для блокировок спина в очереди аналогичны:

Поскольку KeAcquireSpinLockForDpc и KeAcquireInStackQueuedSpinLockForDpc не сбрасывают IRQL при вызове на DISPATCH_LEVEL, они выполняются быстрее, чем KeAcquireSpinLock и KeAcquireInStackQueuedSpinLock соответственно.

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