Condividi tramite


Funzione FltInitializePushLock (fltkernel.h)

La routine FltInitializePushLock inizializza una variabile di blocco push.

Sintassi

VOID FLTAPI FltInitializePushLock(
  [out] PEX_PUSH_LOCK PushLock
);

Parametri

[out] PushLock

Puntatore alla risorsa di archiviazione fornita dal chiamante, che deve essere almeno il valore di sizeof(EX_PUSH_LOCK), affinché la variabile di blocco push venga inizializzata. Lo spazio di archiviazione deve essere allineato a 4 byte su piattaforme a 32 bit e allineato a 8 byte su piattaforme a 64 bit.

Valore restituito

Nessuno

Osservazioni

Un blocco push è una primitiva di sincronizzazione usata per gestire l'accesso alle risorse condivise da più thread. I blocchi push sono simili a strutture ERESOURCE (denominate anche "resources") nei modi seguenti:

  • I blocchi push possono essere usati per la sincronizzazione da un set di thread.

  • I blocchi push possono essere acquisiti per l'accesso condiviso o esclusivo.

  • Anche se il chiamante fornisce lo spazio di archiviazione per la variabile di blocco push, la struttura EX_PUSH_LOCK è opaca, ovvero i relativi membri sono riservati per l'uso del sistema.

I blocchi push potrebbero non essere la scelta giusta per i minifiltri del file system, perché alcune delle loro caratteristiche possono essere incompatibili con la natura intrinsecamente rientrante dei file system.

I blocchi push presentano i seguenti svantaggi rispetto alle strutture ERESOURCE:

  • L'algoritmo per concedere l'accesso esclusivo non è equo a tutti i thread. Se esiste un elevato livello di contesa di blocco esclusivo, non esiste alcuna garanzia sull'ordine in cui ai thread verrà concesso l'accesso esclusivo.

  • Non esistono routine di supporto per determinare il proprietario corrente di un blocco push in fase di esecuzione. Gli utenti di strutture ERESOURCE possono chiamare routine come ExIsResourceAcquiredExclusiveLite per determinare se il thread corrente ha accesso esclusivo alla risorsa.

  • Non sono disponibili estensioni di supporto per determinare il proprietario corrente di un blocco push in fase di debug per diagnosticare i deadlock. Gli utenti delle strutture ERESOURCE possono usare l'estensione !locks in kd o windbg per determinare il proprietario corrente.

  • Non è disponibile alcun supporto per il verificatore del driver per facilitare la diagnosi precoce dei deadlock tramite blocchi push.

  • Non è possibile acquisire blocchi push esclusivi in modo ricorsivo.

I blocchi push offrono i vantaggi seguenti rispetto alle strutture ERESOURCE:

  • Quando i blocchi push vengono acquisiti principalmente per l'accesso condiviso, sono più efficienti delle strutture ERESOURCE.

  • Lo spazio di archiviazione per i blocchi push può essere allocato da un pool di paging o non di paging. Le strutture ERESOURCE devono essere allocate solo da pool non di paging.

  • EX_PUSH_LOCK strutture sono molto più piccole delle strutture ERESOURCE.

A meno che uno di questi vantaggi non sia interessante, un'ERESOURCE è in genere la soluzione più affidabile e gestibile per il problema di sincronizzazione di lettura/scrittura.

Per acquisire un blocco push per l'accesso esclusivo, chiamareFltAcquirePushLockExclusive.

Per acquisire un blocco push per l'accesso condiviso, chiamare FltAcquirePushLockExclusive.

Per rilasciare un blocco push, chiamare FltReleasePushLock.

Per eliminare un blocco push, chiamare FltDeletePushLock.

Fabbisogno

Requisito Valore
client minimo supportato Windows XP SP2 Microsoft
server minimo supportato Windows Server 2003 SP1
piattaforma di destinazione Universale
intestazione fltkernel.h (include Fltkernel.h)
libreria FltMgr.lib
dll Fltmgr.sys
IRQL <= APC_LEVEL

Vedere anche

ExIsResourceAcquiredExclusiveLite

FltAcquirePushLockExclusive

FltAcquirePushLockShared

FltDeletePushLock

FltReleasePushLock