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


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

Чтобы синхронизировать доступ к области памяти, к которой осуществляется доступ как изнутри, так и извне подпрограммы 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 соответственно.

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