Partilhar via


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ê compartilhou dados modificar raramente.Um objeto de sincronização, por exemplo, uma seção crítica, faz com que outros segmentos aguardar até que o recurso compartilhado está disponível.Portanto, se você usar tal objeto para sincronizar o acesso a dados são usados com freqüência, você pode perder a escalabilidade em seu aplicativo.O A modelos paralela a biblioteca (PPL) fornece a concurrency::combinable classe, que permite que você compartilhe um recurso entre vários threads ou tarefas sem a necessidade de sincronização.Para obter mais informações sobre a classe combinable, consulte Contêiner e objetos paralelos.

Seções

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

  • CRITICAL_SECTION

  • reader_writer_lock

  • scoped_lock e scoped_lock_read

  • evento

CRITICAL_SECTION

O concurrency::critical_section classe representa um objeto de exclusão mútua cooperativo que produz a outras tarefas em vez de antecipação-los.As seções críticas são úteis quando vários threads requerem 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 é chamado pelo thread que já possui o bloqueio.

Dd492638.collapse_all(pt-br,VS.110).gifMé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 adquire o bloqueio.

try_lock

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

desbloquear

Libera a seção crítica.

Top

reader_writer_lock

O concurrency::reader_writer_lock classe fornece operações de thread-safe leitura/gravação 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 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 acesso exclusivo a um recurso compartilhado, o que impede o acesso simultâneo de leitura.

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

Quando um thread deve gravar um recurso compartilhado adquire um bloqueio de leitor/gravador, outros threads 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, você não pode atualizar um bloqueio somente leitura para um bloqueio de leitor/gravador ou rebaixar um bloqueio de leitor/gravador para um bloqueio somente leitura.Executar qualquer uma dessas operações produz comportamento não especificado.

Dd492638.collapse_all(pt-br,VS.110).gifMé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.

Top

scoped_lock e scoped_lock_read

O critical_section e reader_writer_lock classes oferecem classes auxiliares aninhados 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 acesso fornecida critical_section de objeto; o destruidor libera 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 com escopo na pilha.Um bloqueio de escopo libera acesso ao seu objeto de exclusão mútua automaticamente quando é destruída; 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 desenrolar, é chamado de destruidor qualquer bloqueio escopo ativo e, portanto, o objeto de exclusão mútua é lançado sempre corretamente.

ObservaçãoObservação

Ao usar o critical_section::scoped_lock, reader_writer_lock::scoped_lock, e reader_writer_lock::scoped_lock_read classes, manualmente não liberar o acesso para o objeto subjacente de exclusão mútua.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 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 tiver concluído o trabalho para outra tarefa.Por exemplo, uma tarefa pode sinalizar outra tarefa que ele tem ler dados de uma conexão de rede ou de um arquivo.

Dd492638.collapse_all(pt-br,VS.110).gifMé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

Aguarda o evento ficar sinalizado.

conjunto

Define o evento para o estado sinalizado.

Redefinir

Define o evento para o estado não sinalizado.

wait_for_multiple

Aguarda vários eventos ficar sinalizado.

Dd492638.collapse_all(pt-br,VS.110).gifExemplo

Para obter um exemplo que mostra como usar o event de classe, consulte Comparando estruturas de dados de sincronização à API.

Top

Seções relacionadas