Condividi tramite


Blocchi di lettura/scrittura slim (SRW)

I blocchi SRW (Slim Reader/Writer) 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 con reader-writer slim tra processi.

I thread di lettura leggono 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 lettore vengono eseguiti in modo continuo, ma le operazioni di scrittura sono rare.

I blocchi SRW offrono 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 di leggere i dati dalla risorsa condivisa contemporaneamente. 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 in combinazione 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 fino a quando 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à incluso, il 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 acquisirlo in modalità condivisa, mentre i thread writer possono acquisirlo in modalità esclusiva. Non esiste alcuna garanzia sull'ordine in cui ai thread che richiedono la proprietà verrà concessa la 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 del blocco. Lo svantaggio è che è possibile archiviare pochissime informazioni sullo stato, quindi i blocchi SRW non rilevano un uso ricorsivo non corretto 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 assegnando 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) dei 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.
InitializeSRWLock Inizializzare un blocco SRW.
ReleaseSRWLockExclusive Rilascia un blocco SRW aperto in modalità esclusiva.
ReleaseSRWLockShared Rilascia un blocco SRW aperto in modalità condivisa.
SleepConditionVariableSRW Sospendo la variabile di condizione specificata e rilascia il blocco specificato come operazione atomica.
TryAcquireSRWLockExclusive Tenta di acquisire un blocco di lettura/scrittura sottile (SRW) in modalità esclusiva. Se la chiamata ha esito positivo, il thread chiamante assume la proprietà del blocco.
TryAcquireSRWLockShared Tenta di acquisire un blocco SRW (Slim Reader/Writer) in modalità condivisa. Se la chiamata ha esito positivo, il thread chiamante assume la proprietà del blocco.