Compartilhar via


Função FltInitializePushLock (fltkernel.h)

A rotina FltInitializePushLock inicializa uma variável de bloqueio de push.

Sintaxe

VOID FLTAPI FltInitializePushLock(
  [out] PEX_PUSH_LOCK PushLock
);

Parâmetros

[out] PushLock

Ponteiro para o armazenamento fornecido pelo chamador, que deve ser pelo menos o valor de sizeof(EX_PUSH_LOCK), para que a variável de bloqueio por push seja inicializada. O armazenamento deve estar alinhado a 4 bytes em plataformas de 32 bits e alinhado de 8 bytes em plataformas de 64 bits.

Retornar valor

Nenhum

Comentários

Bloqueios de push raramente são uma boa opção para minifiltros do sistema de arquivos. Conforme descrito abaixo, algumas de suas características podem ser incompatíveis com a natureza inerentemente reentrante dos sistemas de arquivos.

Os bloqueios de push são semelhantes às estruturas ERESOURCE (também chamadas de "recursos") das seguintes maneiras:

  • Os bloqueios por push podem ser usados para sincronização por um conjunto de threads.
  • Bloqueios de push podem ser adquiridos para acesso compartilhado ou exclusivo.
  • Embora o chamador forneça o armazenamento para a variável de bloqueio por push, a estrutura EX_PUSH_LOCK é opaca: ou seja, seus membros são reservados para uso do sistema.
Os bloqueios por push têm as seguintes desvantagens quando comparados com as estruturas ERESOURCE:
  • O algoritmo para conceder acesso exclusivo não é justo para todos os threads. Se houver um alto nível de contenção de bloqueio exclusivo, não haverá garantia sobre a ordem em que os threads receberão acesso exclusivo.
  • Não há rotinas de suporte para determinar o proprietário atual de um bloqueio de push em tempo de execução. (Os usuários de estruturas ERESOURCE podem chamar rotinas como ExIsResourceAcquiredExclusiveLite para determinar se o thread atual tem acesso exclusivo ao recurso.)
  • Pelo mesmo motivo, não há extensões de suporte para determinar o proprietário atual de um bloqueio de push no momento da depuração e, portanto, diagnosticar deadlocks. (Os usuários de estruturas ERESOURCE podem usar a !locks extensão em kd ou windbg para descobrir isso.)
  • Não há suporte para verificador de driver para ajudar no diagnóstico precoce de deadlocks por meio de bloqueios de push.
  • Os bloqueios de push exclusivos não podem ser adquiridos recursivamente.
Os bloqueios por push oferecem as seguintes vantagens em relação às estruturas ERESOURCE:
  • Quando os bloqueios de push são adquiridos principalmente para acesso compartilhado, eles são mais eficientes do que as estruturas ERESOURCE.
  • O armazenamento para bloqueios por push pode ser alocado do pool paginado ou nãopagado. As estruturas ERESOURCE devem ser alocadas somente do pool nãopagado.
  • EX_PUSH_LOCK estruturas são muito menores do que as estruturas ERESOURCE.
A menos que qualquer uma dessas vantagens seja atraente, um ERESOURCE geralmente é a solução mais robusta e mantenedível para o problema de sincronização de leitura/gravação.

Para adquirir um bloqueio de push para acesso exclusivo, chame FltAcquirePushLockExclusive.

Para adquirir um bloqueio de push para acesso compartilhado, chame FltAcquirePushLockShared.

Para liberar um bloqueio por push, chame FltReleasePushLock.

Para excluir um bloqueio por push, chame FltDeletePushLock.

Requisitos

Requisito Valor
Cliente mínimo com suporte Essa rotina está disponível no Microsoft Windows XP SP2, Microsoft Windows Server 2003 SP1 e posterior.
Plataforma de Destino Universal
Cabeçalho fltkernel.h (inclua Fltkernel.h)
Biblioteca FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

Confira também

ExIsResourceAcquiredExclusiveLite

FltAcquirePushLockExclusive

FltAcquirePushLockShared

FltDeletePushLock

FltReleasePushLock