Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Questo articolo descrive la struttura ERESOURCE e le routine fornite dal sistema che operano su di esso. È possibile usare le strutture ERESOURCE per implementare il blocco di lettura/scrittura nel driver.
Struttura ERESOURCE
La struttura ERESOURCE viene usata per gestire l'accesso alle risorse condivise. Fornisce un meccanismo per sincronizzare l'accesso alle risorse che possono essere condivise tra più thread.
La struttura ERESOURCE è opaca; ovvero, i relativi membri sono riservati per l'uso del sistema.
L'archiviazione per ERESOURCE deve essere allocata da un pool non di paginato.
Routine di gestione delle risorse ERESOURCE
Il sistema fornisce routine per acquisire e rilasciare strutture ERESOURCE e per esaminarne lo stato corrente.
Acquisizione e rilascio di una struttura ERESOURCE
I driver possono usare le strutture ERESOURCE per implementare la sincronizzazione esclusiva/condivisa. La sincronizzazione esclusiva/condivisa funziona come segue:
Un numero qualsiasi di thread può acquisire un ERESOURCE come risorsa condivisa.
Solo un thread può acquisire una risorsa in modo esclusivo. La risorsa ERESOURCE può essere acquisita esclusivamente se nessun thread l'ha già acquisita in modalità condivisa.
Un thread che attualmente non può acquisire un'ERESOURCE può essere inserito facoltativamente in uno stato di attesa fino a quando non è possibile acquisire ERESOURCE. Il sistema gestisce due elenchi di thread in attesa di un ERESOURCE: un elenco di camerieri esclusivi e un elenco di camerieri condivisi.
Un uso tipico per la sincronizzazione esclusiva/condivisa consiste nell'implementare un blocco di lettura/scrittura. Un blocco di lettura/scrittura consente a più thread di eseguire un'operazione di lettura, ma solo un thread può scrivere alla volta. Questo scenario può essere implementato direttamente in termini di acquisizione di un ERESOURCE.
Un driver alloca lo spazio di archiviazione per un oggetto ERESOURCE e lo inizializza con ExInitializeResourceLite. Il sistema gestisce un elenco di tutte le strutture ERESOURCE in uso. Quando il driver non richiede più un particolare ERESOURCE, deve chiamare ExDeleteResourceLite per eliminarlo dall'elenco del sistema. Il driver può anche riutilizzare un ERESOURCE chiamando ExReinitializeResourceLite.
I driver possono eseguire le operazioni di base seguenti su un'ERESOURCE:
Acquisire un ERESOURCE come condiviso con ExAcquireResourceSharedLite. Questa routine acquisisce la risorsa solo se la risorsa non è stata acquisita esclusivamente e non sono presenti camerieri esclusivi.
Acquisisci un ERESOURCE esclusivamente con ExAcquireResourceExclusiveLite. Questa routine acquisisce la risorsa purché non sia stata acquisita esclusivamente o come condivisa.
Convertire un'acquisizione esclusiva in un'acquisizione condivisa con ExConvertExclusiveToSharedLite.
Rilasciare una risorsa acquisita con ExReleaseResourceLite.
Il parametro Wait di ExAcquireResourceSharedLite e ExAcquireResourceExclusiveLite determina se il thread corrente attende l'acquisizione di ERESOURCE. Se si specifica un valore FALSE e non è possibile acquisire ERESOURCE, la routine restituisce FALSE. Se si specifica un valore TRUE, il thread corrente viene inserito nell'elenco di attesa appropriato per ERESOURCE.
Esame dello stato di una struttura ERESOURCE
Un driver può anche determinare lo stato corrente di un'ERESOURCE, come indicato di seguito:
Utilizzare ExIsResourceAcquiredLite o ExIsResourceAcquiredSharedLite per determinare se ERESOURCE è già stato acquisito come condiviso o esclusivo. Usare ExIsResourceAcquiredExclusiveLite per verificare se ERESOURCE è stato acquistato esclusivamente.
Utilizzare ExGetSharedWaiterCount per determinare il numero di camerieri condivisi per ERESOURCE e usare ExGetExclusiveWaiterCount per determinare il numero di waiter esclusivi per ERESOURCE.