Share via


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.

Destruidor reader_writer_lock::scoped_lock_read::~scoped_lock_read

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 Devolução

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.

Confira também

Namespace de simultaneidade
Classe critical_section