reader_writer_lock — Klasa
Blokada zapisywania i zapisywania opartego na kolejce czytnika i zapisywania z lokalnym tylko wirowaniem. Blokada przyznaje najpierw w - pierwszy na out (FIFO) dostęp do pisarzy i głoduje czytelników pod ciągłym obciążeniem pisarzy.
Składnia
class reader_writer_lock;
Elementy członkowskie
Klasy publiczne
Nazwa/nazwisko | opis |
---|---|
klasa reader_writer_lock::scoped_lock | Bezpieczna otoka RAII, która może służyć do uzyskiwania reader_writer_lock obiektów blokady jako składnika zapisywania. |
klasa reader_writer_lock::scoped_lock_read | Bezpieczna otoka RAII, która może służyć do uzyskiwania reader_writer_lock obiektów blokady jako czytnika. |
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
reader_writer_lock | Tworzy nowy reader_writer_lock obiekt. |
~reader_writer_lock Destruktor | reader_writer_lock Niszczy obiekt. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
lock | Uzyskuje blokadę czytnika i zapisywania jako składnik zapisywania. |
lock_read | Uzyskuje blokadę czytnika i zapisywania jako czytelnik. Jeśli są pisarze, aktywni czytelnicy muszą czekać, aż zostaną wykonane. Czytelnik po prostu rejestruje zainteresowanie blokadą i czeka na pisarzy, aby go zwolnić. |
try_lock | Próbuje uzyskać blokadę reader-writer jako składnik zapisywania bez blokowania. |
try_lock_read | Próbuje uzyskać blokadę czytnika i zapisywania jako czytelnik bez blokowania. |
Odblokować | Odblokowuje blokadę czytnika i zapisywania na podstawie tego, kto go zablokował, czytelnika lub pisarza. |
Uwagi
Aby uzyskać więcej informacji, zobacz Synchronizacja struktur danych.
Hierarchia dziedziczenia
reader_writer_lock
Wymagania
Nagłówek: concrt.h
Przestrzeń nazw: współbieżność
lock
Uzyskuje blokadę czytnika i zapisywania jako składnik zapisywania.
void lock();
Uwagi
Często bezpieczniejsze jest wykorzystanie konstrukcji scoped_lock w celu uzyskania i wydania reader_writer_lock
obiektu jako składnika zapisywania w bezpieczny sposób.
Po tym, jak pisarz próbuje uzyskać blokadę, każdy przyszły czytelnik zablokuje do czasu pomyślnego uzyskania i uwolnienia blokady przez pisarzy. Ta blokada jest stronnicza wobec pisarzy i może głodować czytelników pod ciągłym obciążeniem pisarzy.
Autorzy są łańcuchowi, tak aby składnik zapisywania zamykający blokadę zwalnia następny składnik zapisywania w kolejce.
Jeśli blokada jest już przechowywana przez kontekst wywołujący, zostanie zgłoszony wyjątek improper_lock .
lock_read
Uzyskuje blokadę czytnika i zapisywania jako czytelnik. Jeśli są pisarze, aktywni czytelnicy muszą czekać, aż zostaną wykonane. Czytelnik po prostu rejestruje zainteresowanie blokadą i czeka na pisarzy, aby go zwolnić.
void lock_read();
Uwagi
Często bezpieczniejsze jest wykorzystanie konstrukcji scoped_lock_read w celu uzyskania i wydania reader_writer_lock
obiektu jako czytelnika w bezpieczny sposób.
Jeśli są pisarze czekający na blokadę, czytelnik będzie czekać, aż wszyscy pisarze w kolejce nabyli i zwolnili blokadę. Ta blokada jest stronnicza wobec pisarzy i może głodować czytelników pod ciągłym obciążeniem pisarzy.
Klasa reader_writer_lock
Tworzy nowy reader_writer_lock
obiekt.
reader_writer_lock();
~reader_writer_lock
reader_writer_lock
Niszczy obiekt.
~reader_writer_lock();
Uwagi
Oczekuje się, że blokada nie jest już przechowywana podczas uruchamiania destruktora. Umożliwienie blokady zapisywania czytnika do destrukcji z blokadą nadal przechowywane wyniki w niezdefiniowanym zachowaniu.
klasa reader_writer_lock::scoped_lock
Bezpieczna otoka RAII, która może służyć do uzyskiwania reader_writer_lock
obiektów blokady jako składnika zapisywania.
class scoped_lock;
scoped_lock::scoped_lock
scoped_lock
Tworzy obiekt i uzyskuje reader_writer_lock
obiekt przekazany w parametrze _Reader_writer_lock
jako składnik zapisywania. Jeśli blokada jest przechowywana przez inny wątek, to wywołanie zostanie zablokowane.
explicit _CRTIMP scoped_lock(reader_writer_lock& _Reader_writer_lock);
Parametry
_Reader_writer_lock
reader_writer_lock
Obiekt, który ma zostać uzyskany jako składnik zapisywania.
scoped_lock::~scoped_lock
Niszczy obiekt i zwalnia blokadę reader_writer_lock
dostarczoną w konstruktorze.
~scoped_lock();
klasa reader_writer_lock::scoped_lock_read
Bezpieczna otoka RAII, która może służyć do uzyskiwania reader_writer_lock
obiektów blokady jako czytnika.
class scoped_lock_read;
scoped_lock_read::scoped_lock_read
scoped_lock_read
Tworzy obiekt i uzyskuje reader_writer_lock
obiekt przekazany w parametrze _Reader_writer_lock
jako czytelnik. Jeśli blokada jest przechowywana przez inny wątek jako składnik zapisywania lub istnieją oczekujące zapisy, to wywołanie zostanie zablokowane.
explicit _CRTIMP scoped_lock_read(reader_writer_lock& _Reader_writer_lock);
Parametry
_Reader_writer_lock
Obiekt reader_writer_lock
, który ma zostać uzyskany jako czytelnik.
reader_writer_lock::scoped_lock_read::~scoped_lock_read Destruktor
Niszczy obiekt i zwalnia blokadę scoped_lock_read
dostarczoną w konstruktorze.
~scoped_lock_read();
try_lock
Próbuje uzyskać blokadę reader-writer jako składnik zapisywania bez blokowania.
Składnia
bool try_lock();
Wartość zwracana
Jeśli blokada została uzyskana, wartość true
; w przeciwnym razie wartość false
.
try_lock_read
Próbuje uzyskać blokadę czytnika i zapisywania jako czytelnik bez blokowania.
bool try_lock_read();
Wartość zwracana
Jeśli blokada została uzyskana, wartość true
; w przeciwnym razie wartość false
.
Odblokować
Odblokowuje blokadę czytnika i zapisywania na podstawie tego, kto go zablokował, czytelnika lub pisarza.
void unlock();
Uwagi
Jeśli są pisarze czekający na blokadę, wydanie blokady zawsze przejdzie do następnego składnika zapisywania w kolejności FIFO. Ta blokada jest stronnicza wobec pisarzy i może głodować czytelników pod ciągłym obciążeniem pisarzy.