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


Функция FltInitializePushLock (fltkernel.h)

Подпрограмма fltInitializePushLock инициализирует переменную блокировки push-блокировки.

Синтаксис

VOID FLTAPI FltInitializePushLock(
  [out] PEX_PUSH_LOCK PushLock
);

Параметры

[out] PushLock

Указатель на хранилище, предоставленное вызывающей стороной, которое должно быть по крайней мере значением sizeof (EX_PUSH_LOCK), чтобы переменная блокировки push-блокировки была инициализирована. Хранилище должно быть 4-байтовое выравнивание на 32-разрядных платформах, а 8-байтовое выравнивание на 64-разрядных платформах.

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

Никакой

Замечания

Блокировка принудительной передачи — это примитив синхронизации, используемый для управления доступом к общим ресурсам несколькими потоками. Блоки принудительной отправки похожи на структуры ERESOURCE (также называемые "ресурсы") следующими способами:

  • Push-блокировки можно использовать для синхронизации набором потоков.

  • Блокировки push-уведомлений можно получить для общего или эксклюзивного доступа.

  • Хотя вызывающий объект предоставляет хранилище для переменной принудительной блокировки, структура EX_PUSH_LOCK непрозрачна: то есть ее члены зарезервированы для использования системы.

Блокировки push-уведомлений могут не быть правильным выбором для мини-фильтраторов файловой системы, так как некоторые из их характеристик могут быть несовместимы с изначально повторной записью файловых систем.

При сравнении со структурами ERESOURCE следующие недостатки:

  • Алгоритм предоставления эксклюзивного доступа не является справедливым для всех потоков. Если существует высокий уровень конфликтов с монопольной блокировкой, нет никаких гарантий в том порядке, в котором потоки будут предоставлены монопольный доступ.

  • Во время выполнения не существуют процедуры поддержки для определения текущего владельца принудительной блокировки. Пользователи структур ERESOURCE могут вызывать подпрограммы, такие как ExIsResourceAcquiredExclusiveLite, чтобы определить, имеет ли текущий поток монопольный доступ к ресурсу.

  • Нет расширений поддержки для определения текущего владельца принудительной блокировки во время отладки для диагностики взаимоблокировок. Пользователи структур ERESOURCE могут использовать расширение !locks в kd или windbg для определения текущего владельца.

  • Нет поддержки средства проверки драйверов, чтобы помочь ранней диагностике взаимоблокировок через push-блокировки.

  • Монопольные блокировки push-уведомлений не могут быть получены рекурсивно.

Push-блокировки предлагают следующие преимущества преимущества по сравнению со структурами ERESOURCE:

  • При получении принудительной блокировки в основном для общего доступа они более эффективны, чем структуры ERESOURCE.

  • Хранилище для push-блокировок можно выделить из страничного или непагированного пула. Структуры ERESOURCE должны быть выделены только из непагированного пула.

  • EX_PUSH_LOCK структуры гораздо меньше, чем структуры ERESOURCE.

Если ни одно из этих преимуществ не является убедительным, ERESOURCE обычно является более надежным и обслуживаемым решением проблемы синхронизации чтения и записи.

Чтобы получить блокировку принудительной отправки для эксклюзивного доступа, вызовитеFltAcquirePushLockExclusive.

Чтобы получить блокировку принудительной отправки для общего доступа, вызовите FltAcquirePushLockExclusive.

Чтобы освободить блокировку push-уведомлений, вызовите FltReleasePushLock.

Чтобы удалить блокировку push-уведомлений, вызовите FltDeletePushLock.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP с пакетом обновления 2 (SP2) Майкрософт
минимальный поддерживаемый сервер Windows Server 2003 с пакетом обновления 1 (SP1)
целевая платформа Всеобщий
заголовка fltkernel.h (include Fltkernel.h)
библиотеки FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

См. также

ExIsResourceAcquiredExclusiveLite

FltAcquirePushLockExclusive

FltAcquirePushLockShared

FltDeletePushLock

FltReleasePushLock