Estruturas de dados de sincronização

O Runtime de simultaneidade fornece diversas estruturas de dados que permitem sincronizar o acesso aos dados compartilhados de vários threads. Essas estruturas de dados são úteis quando você tiver compartilhado a dados que você pode modificar com pouca freqüência. Um objeto de sincronização, por exemplo, uma seção crítica, faz com que outros segmentos para esperar até que o recurso compartilhado esteja disponível. Portanto, se você usar tal objeto para sincronizar o acesso a dados são usados com freqüência, você poderá perder a escalabilidade em seu aplicativo. O Biblioteca paralela de padrões (PPL) fornece a Concurrency::combinable classe, que lhe permite compartilhar um recurso entre vários threads ou tarefas sem a necessidade de sincronização. For more information about the combinable class, see Paralelo recipientes e objetos.

Seções

Este tópico descreve os seguintes tipos de bloco de mensagens assíncronas em detalhes:

  • CRITICAL_SECTION

  • reader_writer_lock

  • scoped_lock e scoped_lock_read

  • Evento

CRITICAL_SECTION

O Concurrency::critical_section classe representa um objeto cooperativo de exclusão mútua que gera a outras tarefas em vez de antecipação-los. As seções críticas são úteis quando vários threads exigem exclusiva acesso de leitura e gravação aos dados compartilhados.

O critical_section classe é não-reentrante. O Concurrency::critical_section::lock método lança uma exceção do tipo Concurrency::improper_lock se ele for chamado pelo thread que já possui o bloqueio.

Métodos e recursos

A tabela a seguir mostra os métodos importantes que são definidos pelo critical_section classe.

Método

Descrição

Bloqueio

Adquire a seção crítica. Os blocos de contexto chamada até que ele adquire o bloqueio.

try_lock

Tenta adquirir a seção crítica, mas não bloqueia.

desbloquear

Libera a seção crítica.

go to top

reader_writer_lock

O Concurrency::reader_writer_lock classe fornece o thread-safe operações de leitura aos dados compartilhados. Use bloqueios de leitor/gravador quando vários threads requerem acesso simultâneo de leitura a um recurso compartilhado, mas raramente escrever com o recurso compartilhado. Essa classe fornece acesso de gravação de apenas um segmento a um objeto a qualquer momento.

O reader_writer_lock classe pode executar melhor do que o critical_section classe porque um critical_section objeto adquire o acesso exclusivo a um recurso compartilhado, que impede o acesso de leitura simultâneas.

Como o critical_section classe, o reader_writer_lock classe representa um objeto cooperativo de exclusão mútua que gera a outras tarefas em vez de antecipação-los.

Quando um thread que precisa gravar um recurso compartilhado adquire um bloqueio de leitor/gravador, outros threads que também devem acessar o recurso são bloqueados até que o escritor libera o bloqueio. O reader_writer_lock classe é um exemplo de um preferência de gravação lock, que é um bloqueio que desbloqueia gravadores aguardando antes de ele desbloqueia leitores aguardando.

Como o critical_section classe, o reader_writer_lock classe é não-reentrante. O Concurrency::reader_writer_lock::lock e Concurrency::reader_writer_lock::lock_read métodos lançam uma exceção do tipo improper_lock se eles são chamados por um thread que já possui o bloqueio.

ObservaçãoObservação

Porque o reader_writer_lock classe é não reentrante, não é possível atualizar um bloqueio de somente leitura para um bloqueio de leitor/gravador ou desatualizar um bloqueio de leitor/gravador para um bloqueio somente leitura. Executar qualquer uma dessas operações produz o comportamento não especificado.

Métodos e recursos

A tabela a seguir mostra os métodos importantes que são definidos pelo reader_writer_lock classe.

Método

Descrição

Bloqueio

Adquire o acesso de leitura/gravação para o bloqueio.

try_lock

Tenta adquirir acesso de leitura/gravação para o bloqueio, mas não bloqueia.

lock_read

Adquire o acesso somente leitura ao bloqueio.

try_lock_read

Tenta adquirir acesso somente leitura ao bloqueio, mas não bloqueia.

desbloquear

Libera o bloqueio.

go to top

scoped_lock e scoped_lock_read

O critical_section e reader_writer_lock classes oferecem classes auxiliares aninhadas, que simplificam a maneira de trabalhar com objetos de exclusão mútua. Essas classes auxiliares são conhecidos como escopo bloqueios.

O critical_section classe contém o Concurrency::critical_section::scoped_lock classe. O construtor adquire o acesso a fornecida critical_section objeto; o destruidor libera o acesso ao objeto. O reader_writer_lock classe contém o Concurrency::reader_writer_lock::scoped_lock classe, semelhante a critical_section::scoped_lock, exceto que ele gerencia o acesso de gravação fornecida reader_writer_lock objeto. O reader_writer_lock classe também contém o Concurrency::reader_writer_lock::scoped_lock_read classe. Essa classe gerencia o acesso de leitura fornecida reader_writer_lock objeto.

Escopo de bloqueios fornecem vários benefícios quando você estiver trabalhando com critical_section e reader_writer_lock objetos manualmente. Normalmente, você pode alocar um bloqueio de escopo na pilha. Um bloqueio de escopo libera o acesso ao seu objeto de exclusão mútua automaticamente quando destruí-la; Portanto, você não desbloquear manualmente o objeto subjacente. Isso é útil quando uma função contém várias return instruções. Bloqueios de escopo podem ajudá-lo a escrever código seguro de exceção. Quando um throw instrução faz com que a pilha de desenrolar o destruidor qualquer bloqueio escopo ativo é chamado e, portanto, o objeto de exclusão mútua sempre corretamente é liberado.

ObservaçãoObservação

Quando você usa o critical_section::scoped_lock, reader_writer_lock::scoped_lock, e reader_writer_lock::scoped_lock_read classes, manualmente é liberar o acesso para o objeto de exclusão mútua subjacente. Isso pode colocar o tempo de execução em um estado inválido.

Evento

O Concurrency::event classe representa um objeto de sincronização, cujo estado pode ser sinalizado ou não sinalizado. Ao contrário de objetos de sincronização, como, por exemplo, as seções críticas, cujo objetivo é proteger o acesso aos dados compartilhados, eventos sincronizam o fluxo de execução.

O event classe é útil quando uma tarefa foi concluída de trabalho para outra tarefa. Por exemplo, uma tarefa pode sinalizar outra tarefa que ele tem ler dados a partir de uma conexão de rede ou um arquivo.

Métodos e recursos

A tabela a seguir mostra vários métodos importantes que são definidos pelo event classe.

Método

Descrição

Aguarde

Espera-se para o evento ficar sinalizado.

Definir

Define o evento para o estado sinalizado.

Redefinir

Define o evento para o estado não sinalizado.

wait_for_multiple

Espera por vários eventos ficar sinalizado.

Exemplo

Para obter um exemplo que mostra como usar o event da classe, consulte Comparando as estruturas de dados de sincronização para a API do Windows..

go to top

Seções relacionadas