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.