Condividi tramite


Classe reader_writer_lock

Un blocco reader-writer basato sulla coda di preferenza writer con solo spin locale. Il blocco concede l'accesso FIFO (First in First out) a writer e può essere dannoso per i reader in condizioni di continuo caricamento di writer.

Sintassi

class reader_writer_lock;

Membri

Classi pubbliche

Nome Descrizione
Classe reader_writer_lock::scoped_lock Wrapper RAII sicuro di eccezione che può essere usato per acquisire reader_writer_lock oggetti di blocco come writer.
Classe reader_writer_lock::scoped_lock_read Wrapper RAII sicuro che può essere usato per acquisire reader_writer_lock oggetti di blocco come lettore.

Costruttori pubblici

Nome Descrizione
reader_writer_lock Costruisce un oggetto reader_writer_lock nuovo.
Distruttore ~reader_writer_lock Elimina definitivamente l'oggetto reader_writer_lock .

Metodi pubblici

Nome Descrizione
lock Acquisisce il blocco reader-writer come writer.
lock_read Acquisisce il blocco reader-writer come lettore. Se ci sono writer, i lettori attivi devono aspettare fino a quando non vengono eseguiti. Il lettore registra semplicemente un interesse nel blocco e attende che i writer lo rilascino.
try_lock Tenta di acquisire il blocco reader-writer come writer senza bloccare.
try_lock_read Tenta di acquisire il blocco reader-writer come lettore senza bloccare.
unlock Sblocca il blocco reader-writer in base a chi lo ha bloccato, lettore o writer.

Osservazioni:

Per altre informazioni, vedere Strutture dei dati di sincronizzazione.

Gerarchia di ereditarietà

reader_writer_lock

Requisiti

Intestazione: concrt.h

Spazio dei nomi: Concurrency

lock

Acquisisce il blocco reader-writer come writer.

void lock();

Osservazioni:

Spesso è più sicuro usare il costrutto scoped_lock per acquisire e rilasciare un reader_writer_lock oggetto come writer in modo sicuro.

Dopo il tentativo di acquisizione del blocco da parte di un writer, qualsiasi lettore futuro si bloccherà finché il blocco non sarà stato acquisito e rilasciato correttamente dai writer. Questo blocco è distorto verso gli scrittori e può morire di fame con un carico continuo di writer.

I writer vengono concatenati in modo che un writer che esce dal blocco rilascia il writer successivo in linea.

Se il blocco è già mantenuto dal contesto chiamante, verrà generata un'eccezione improper_lock .

lock_read

Acquisisce il blocco reader-writer come lettore. Se ci sono writer, i lettori attivi devono aspettare fino a quando non vengono eseguiti. Il lettore registra semplicemente un interesse nel blocco e attende che i writer lo rilascino.

void lock_read();

Osservazioni:

Spesso è più sicuro usare il costrutto scoped_lock_read per acquisire e rilasciare un reader_writer_lock oggetto come lettore in modo sicuro.

Se sono presenti writer in attesa del blocco, il lettore attenderà fino a quando tutti i writer in linea non hanno acquisito e rilasciato il blocco. Questo blocco è distorto verso gli scrittori e può morire di fame con un carico continuo di writer.

reader_writer_lock

Costruisce un oggetto reader_writer_lock nuovo.

reader_writer_lock();

~reader_writer_lock

Elimina definitivamente l'oggetto reader_writer_lock .

~reader_writer_lock();

Osservazioni:

È previsto che il blocco non venga più mantenuto quando viene eseguito il distruttore. Se si consente al blocco del writer di lettura di destruire con il blocco, il comportamento non definito risulta ancora bloccato.

Classe reader_writer_lock::scoped_lock

Wrapper RAII sicuro di eccezione che può essere usato per acquisire reader_writer_lock oggetti di blocco come writer.

class scoped_lock;

scoped_lock::scoped_lock

Costruisce un scoped_lock oggetto e acquisisce l'oggetto reader_writer_lock passato nel _Reader_writer_lock parametro come writer. Se il blocco viene mantenuto da un altro thread, questa chiamata verrà bloccata.

explicit _CRTIMP scoped_lock(reader_writer_lock& _Reader_writer_lock);

Parametri

_Reader_writer_lock
Oggetto reader_writer_lock da acquisire come writer.

scoped_lock::~scoped_lock

Elimina un reader_writer_lock oggetto e rilascia il blocco fornito nel relativo costruttore.

~scoped_lock();

Classe reader_writer_lock::scoped_lock_read

Wrapper RAII sicuro che può essere usato per acquisire reader_writer_lock oggetti di blocco come lettore.

class scoped_lock_read;

scoped_lock_read::scoped_lock_read

Costruisce un scoped_lock_read oggetto e acquisisce l'oggetto reader_writer_lock passato nel _Reader_writer_lock parametro come lettore. Se il blocco viene mantenuto da un altro thread come writer o se sono presenti writer in sospeso, questa chiamata verrà bloccata.

explicit _CRTIMP scoped_lock_read(reader_writer_lock& _Reader_writer_lock);

Parametri

_Reader_writer_lock
Oggetto reader_writer_lock da acquisire come lettore.

Distruttore reader_writer_lock::scoped_lock_read::~scoped_lock_read

Elimina un scoped_lock_read oggetto e rilascia il blocco fornito nel relativo costruttore.

~scoped_lock_read();

try_lock

Tenta di acquisire il blocco reader-writer come writer senza bloccare.

Sintassi

bool try_lock();

Valore restituito

Se il blocco è stato acquisito, il valore true; in caso contrario, il valore false.

try_lock_read

Tenta di acquisire il blocco reader-writer come lettore senza bloccare.

bool try_lock_read();

Valore restituito

Se il blocco è stato acquisito, il valore true; in caso contrario, il valore false.

unlock

Sblocca il blocco reader-writer in base a chi lo ha bloccato, lettore o writer.

void unlock();

Osservazioni:

Se sono presenti writer in attesa del blocco, il rilascio del blocco passerà sempre al writer successivo nell'ordine FIFO. Questo blocco è distorto verso gli scrittori e può morire di fame con un carico continuo di writer.

Vedi anche

Spazio dei nomi concurrency
Classe critical_section