Classe reader_writer_lock
Um bloqueio de leitor-gravador baseado em fila de preferência de gravador com a rotação local apenas. O bloqueio concede acesso FIFO (first in - first out, primeiro a entrar, primeiro a sair) a gravadores e priva os leitores de recursos sob uma carga contínua de gravadores.
Sintaxe
class reader_writer_lock;
Membros
Classes públicas
Nome | Descrição |
---|---|
reader_writer_lock::scoped_lock Classe | Um wrapper RAII seguro de exceção que pode ser usado para adquirir objetos reader_writer_lock de bloqueio como gravador. |
reader_writer_lock::scoped_lock_read Classe | Um wrapper RAII seguro de exceção que pode ser usado para adquirir objetos reader_writer_lock de bloqueio como um leitor. |
Construtores públicos
Nome | Descrição |
---|---|
reader_writer_lock | Constrói um novo objeto reader_writer_lock . |
Destruidor ~reader_writer_lock | Destrói o objeto reader_writer_lock . |
Métodos públicos
Nome | Descrição |
---|---|
lock | Adquire o bloqueio leitor-gravador como um gravador. |
lock_read | Adquire o bloqueio leitor-gravador como um leitor. Se houver escritores, os leitores ativos terão que esperar até que eles sejam feitos. O leitor simplesmente registra um interesse no bloqueio e aguarda os gravadores liberá-lo. |
try_lock | Tenta adquirir o bloqueio leitor-gravador como um gravador sem bloqueio. |
try_lock_read | Tenta adquirir o bloqueio leitor-gravador como um leitor sem bloqueio. |
unlock | Desbloqueia o bloqueio leitor-gravador com base em quem o bloqueou, leitor ou gravador. |
Comentários
Para obter mais informações, confira Estrutura de dados de sincronização.
Hierarquia de herança
reader_writer_lock
Requisitos
Cabeçalho: concrt.h
Namespace: concurrency
lock
Adquire o bloqueio leitor-gravador como um gravador.
void lock();
Comentários
Geralmente, é mais seguro utilizar a construção scoped_lock para adquirir e liberar um objeto reader_writer_lock
como um gravador de uma maneira segura de exceção.
Depois que um gravador tentar adquirir o bloqueio, todos os futuros leitores serão bloqueados até que os gravadores tenham adquirido e liberado o bloqueio com êxito. Esse bloqueio é tendencioso em relação aos gravadores e pode deixar os leitores famintos sob uma carga contínua de gravadores.
Os gravadores são encadeados para que um gravador que saia do bloqueio libere o próximo gravador na linha.
Se o bloqueio já for mantido pelo contexto de chamada, uma exceção improper_lock será gerada.
lock_read
Adquire o bloqueio leitor-gravador como um leitor. Se houver escritores, os leitores ativos terão que esperar até que eles sejam feitos. O leitor simplesmente registra um interesse no bloqueio e aguarda os gravadores liberá-lo.
void lock_read();
Comentários
Geralmente, é mais seguro utilizar a construção scoped_lock_read para adquirir e liberar um objeto reader_writer_lock
como um leitor de uma maneira segura de exceção.
Se houver gravadores esperando no bloqueio, o leitor aguardará até que todos os gravadores na fila tenham adquirido e liberado o bloqueio. Esse bloqueio é tendencioso em relação aos gravadores e pode deixar os leitores famintos sob uma carga contínua de gravadores.
reader_writer_lock
Constrói um novo objeto reader_writer_lock
.
reader_writer_lock();
~ reader_writer_lock
Destrói o objeto reader_writer_lock
.
~reader_writer_lock();
Comentários
Espera-se que o bloqueio deixe de ser mantido quando o destruidor for executado. Permitir que o bloqueio do gravador do leitor seja destruído, com o bloqueio ainda mantido resulta em um comportamento indefinido.
reader_writer_lock::scoped_lock Classe
Um wrapper RAII seguro de exceção que pode ser usado para adquirir objetos reader_writer_lock
de bloqueio como gravador.
class scoped_lock;
scoped_lock::scoped_lock
Constrói um objeto scoped_lock
e adquire o objeto reader_writer_lock
passado no parâmetro _Reader_writer_lock
como um gravador. Se o bloqueio for mantido por outro thread, essa chamada será bloqueada.
explicit _CRTIMP scoped_lock(reader_writer_lock& _Reader_writer_lock);
Parâmetros
_Reader_writer_lock
O objeto reader_writer_lock
a ser adquirido como um gravador.
scoped_lock::~scoped_lock
Destrói um objeto reader_writer_lock
e libera o bloqueio fornecido em seu construtor.
~scoped_lock();
reader_writer_lock::scoped_lock_read Classe
Um wrapper RAII seguro de exceção que pode ser usado para adquirir objetos reader_writer_lock
de bloqueio como um leitor.
class scoped_lock_read;
scoped_lock_read::scoped_lock_read
Constrói um objeto scoped_lock_read
e adquire o objeto reader_writer_lock
passado no parâmetro _Reader_writer_lock
como um leitor. Se o bloqueio for mantido por outro thread como um gravador ou houver gravadores pendentes, essa chamada será bloqueada.
explicit _CRTIMP scoped_lock_read(reader_writer_lock& _Reader_writer_lock);
Parâmetros
_Reader_writer_lock
O objeto reader_writer_lock
a ser adquirido como um leitor.
reader_writer_lock::scoped_lock_read::~scoped_lock_read Destruidor
Destrói um objeto scoped_lock_read
e libera o bloqueio fornecido em seu construtor.
~scoped_lock_read();
try_lock
Tenta adquirir o bloqueio leitor-gravador como um gravador sem bloqueio.
Sintaxe
bool try_lock();
Valor retornado
Se o bloqueio foi adquirido, o valor true
, caso contrário, o valor false
.
try_lock_read
Tenta adquirir o bloqueio leitor-gravador como um leitor sem bloqueio.
bool try_lock_read();
Valor de retorno
Se o bloqueio foi adquirido, o valor true
, caso contrário, o valor false
.
desbloquear
Desbloqueia o bloqueio leitor-gravador com base em quem o bloqueou, leitor ou gravador.
void unlock();
Comentários
Se houver gravadores esperando no bloqueio, a liberação do bloqueio sempre irá para o próximo gravador na ordem FIFO. Esse bloqueio é tendencioso em relação aos gravadores e pode deixar os leitores famintos sob uma carga contínua de gravadores.