Condividi tramite


Classe reader_writer_lock

Un blocco lettore-scrittore basato sulla coda di preferenza writer con spin solo locale. Il blocco concede l'accesso FIFO (First in First out) agli scrittori e affama i lettori sotto un carico continuo di scrittura.

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 resistente alle eccezioni che può essere utilizzato per acquisire oggetti di blocco reader_writer_lock come lettore.

Costruttori pubblici

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

Metodi pubblici

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

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 lock è orientato verso gli scriventi e può affamare i lettori sotto un carico continuo di scriventi.

Gli scrittori sono incatenati in modo che uno scrittore, lasciando il blocco, rilasci il 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 scriventi, i lettori attivi devono aspettare fino a quando non completano il loro lavoro. Il lettore registra semplicemente un interesse nel lucchetto e attende che gli scrittori lo rilascino.

void lock_read();

Osservazioni:

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

Se ci sono degli scrittori in attesa del blocco, il lettore aspetterà finché tutti gli scrittori in coda non avranno acquisito e rilasciato il blocco. Questo lock è orientato verso gli scriventi e può affamare i lettori sotto un carico continuo di scriventi.

blocco_lettore_scrittore

Costruisce un oggetto reader_writer_lock nuovo.

reader_writer_lock();

~blocco_lettori_scrittori

Elimina definitivamente l'oggetto reader_writer_lock .

~reader_writer_lock();

Osservazioni:

È previsto che il blocco non venga più mantenuto quando viene eseguito il distruttore. Consentire al blocco di lettura-scrittura di essere distrutto mentre è ancora detenuto risulta in un comportamento indefinito.

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 scrittore.

scoped_lock::~scoped_lock

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

~scoped_lock();

Classe reader_writer_lock::scoped_lock_read

Wrapper RAII resistente alle eccezioni che può essere utilizzato per acquisire oggetti di blocco reader_writer_lock 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 è detenuto da un altro thread come scrittore o se sono presenti scrittori in sospeso, questa chiamata si bloccherà.

explicit _CRTIMP scoped_lock_read(reader_writer_lock& _Reader_writer_lock);

Parametri

_Reader_writer_lock
Oggetto reader_writer_lock da acquisire in qualità di lettore.

Distruttore reader_writer_lock::scoped_lock_read::~scoped_lock_read

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

~scoped_lock_read();

try_lock

Tenta di acquisire il blocco lettore-scrittore come scrittore 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 lettore-scrittore 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 lettore-scrittore in base a chi lo ha bloccato, lettore o scrittore.

void unlock();

Osservazioni:

Se sono presenti writer in attesa del blocco, il rilascio del blocco passerà sempre al writer successivo nell'ordine FIFO. Questo lock è orientato verso gli scriventi e può affamare i lettori sotto un carico continuo di scriventi.

Vedi anche

Spazio dei nomi concorrenza
Classe critical_section