Condividi tramite


Blocchi di lettura/writer sottile (SRW)

I blocchi SRW (Reader/Writer) sottili consentono ai thread di un singolo processo di accedere alle risorse condivise; sono ottimizzati per la velocità e occupano molto poco memoria. Non è possibile condividere blocchi di reader-writer sottili tra processi.

I thread lettore leggeno i dati da una risorsa condivisa, mentre i thread writer scrivono dati in una risorsa condivisa. Quando più thread stanno leggendo e scrivendo usando una risorsa condivisa, i blocchi esclusivi, ad esempio una sezione critica o un mutex, possono diventare un collo di bottiglia se i thread di lettura vengono eseguiti continuamente, ma le operazioni di scrittura sono rare.

I blocchi SRW forniscono due modalità in cui i thread possono accedere a una risorsa condivisa:

  • Modalità condivisa, che concede l'accesso condiviso in sola lettura a più thread di lettura, che consente loro di leggere i dati dalla risorsa condivisa simultaneamente. Se le operazioni di lettura superano le operazioni di scrittura, questa concorrenza aumenta le prestazioni e la velocità effettiva rispetto alle sezioni critiche.

    Nota

    I blocchi SRW in modalità condivisa non devono essere acquisiti in modo ricorsivo perché ciò può causare deadlock quando combinato con l'acquisizione esclusiva.

  • Modalità esclusiva, che concede l'accesso in lettura/scrittura a un thread writer alla volta. Quando il blocco è stato acquisito in modalità esclusiva, nessun altro thread può accedere alla risorsa condivisa finché il writer non rilascia il blocco.

    Nota

    I blocchi SRW in modalità esclusiva non possono essere acquisiti in modo ricorsivo. Se un thread tenta di acquisire un blocco già presente, tale tentativo avrà esito negativo (per TryAcquireSRWLockExclusive) o deadlock (per AcquireSRWLockExclusive)

Un singolo blocco SRW può essere acquisito in entrambe le modalità; i thread lettore possono acquisire in modalità condivisa mentre i thread writer possono acquisire in modalità esclusiva. Non vi è alcuna garanzia sull'ordine in cui i thread che richiedono la proprietà verranno concessi alla proprietà; I blocchi SRW non sono né equi né FIFO.

Un blocco SRW è la dimensione di un puntatore. Il vantaggio è che è veloce aggiornare lo stato di blocco. Lo svantaggio è che le informazioni sullo stato molto piccole possono essere archiviate, quindi i blocchi SRW non rilevano l'uso ricorsivo errato in modalità condivisa. Inoltre, un thread proprietario di un blocco SRW in modalità condivisa non può aggiornare la proprietà del blocco alla modalità esclusiva.

Il chiamante deve allocare una struttura SRWLOCK e inizializzarla chiamando InitializeSRWLock (per inizializzare la struttura in modo dinamico) o assegnare la costante SRWLOCK_INIT alla variabile di struttura (per inizializzare la struttura in modo statico).

È possibile usare Application Verifier per trovare l'uso ricorsivo (reentrant) di blocchi SRW.

Di seguito sono riportate le funzioni di blocco SRW.

Funzione di blocco SRW Descrizione
AcquireSRWLockExclusive Acquisisce un blocco SRW in modalità esclusiva.
AcquireSRWLockShared Acquisisce un blocco SRW in modalità condivisa.
InizializzaSRWLock Inizializzare un blocco SRW.
ReleaseSRWLockExclusive Rilascia un blocco SRW aperto in modalità esclusiva.
ReleaseSRWLockShared Rilascia un blocco SRW aperto in modalità condivisa.
SleepConditionVariableSRW Dorme nella variabile di condizione specificata e rilascia il blocco specificato come operazione atomica.
TryAcquireSRWLockExclusive Tenta di acquisire un blocco SRW (Slim Reader/Writer) in modalità esclusiva. Se la chiamata ha esito positivo, il thread chiamante accetta la proprietà del blocco.
TryAcquireSRWLockShared Tenta di acquisire un blocco di lettura/writer (SRW) sottile in modalità condivisa. Se la chiamata ha esito positivo, il thread chiamante accetta la proprietà del blocco.