Estruturas de dados de sincronização
O tempo de execução de simultaneidade o fornece várias estruturas de dados que permitem para sincronizar o acesso a dados compartilhados de vários threads. Essas estruturas de dados são úteis quando você compartilhou os dados que você alterar com pouca frequência. Um objeto de sincronização, por exemplo, uma seção crítica, faz com que outros threads esperem até que o recurso compartilhado está disponível. Em virtude disso, se você usar esse objeto para sincronizar o acesso aos dados que é usado frequentemente, você pode perder a escalabilidade em seu aplicativo. Biblioteca de padrões paralelos (PPL) fornece a classe de concurrency::combinable , que permite compartilhar um recurso entre vários threads ou tarefas sem a necessidade da sincronização. Para obter mais informações sobre a classe combinable, consulte Contêineres e objetos em paralelo.
Seções
Este tópico descreve os seguintes tipos de mensagens assíncronas do bloco em detalhes:
critical_section
reader_writer_lock
scoped_lock e scoped_lock_read
evento
critical_section
A classe de concurrency::critical_section representa um objeto cooperativo de exclusão mútua que gerencie a outras tarefas em vez de cancelar. As seções críticos são úteis quando vários threads exigem acesso de leitura e gravação exclusivo a dados compartilhados.
A classe de critical_section for não reentrante. O método de concurrency::critical_section::lock gerará uma exceção do tipo concurrency::improper_lock se 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 pela classe de critical_section .
Método |
Descrição |
---|---|
Adquire a seção crítica. Os blocos de contexto de chamada até que adquirir o bloqueio. |
|
Tenta adquirir a seção crítica, mas não bloqueia. |
|
Libera a seção crítica. |
[Superior]
reader_writer_lock
A classe de concurrency::reader_writer_lock fornece operações de leitura/gravação de seguras a dados compartilhados. O leitor/gravador de uso bloqueios quando vários threads exigem acesso de leitura simultâneo a um recurso compartilhado mas raramente grava ao recurso compartilhado. Esta classe fornece apenas um acesso de gravação de threads que a um objeto a qualquer momento.
A classe de reader_writer_lock pode executar melhor do que a classe de critical_section como um objeto de critical_section adquirir acesso exclusivo a um recurso compartilhado, que impede o acesso de leitura simultâneo.
Como a classe de critical_section , a classe de reader_writer_lock representa um objeto cooperativo de exclusão mútua que gerencie a outras tarefas em vez de cancelar.
Quando um thread que deve gravar em um recurso compartilhado adquire um bloqueio de leitor/gravador, outros threads que também deve acessar o recurso são bloqueadas até que o gravador libere o bloqueio. A classe de reader_writer_lock é um exemplo de um bloqueio de gravação preferência , que é um bloqueio que desbloqueie gravadores de espera antes de desbloqueie leitores de espera.
Como a classe de critical_section , a classe de reader_writer_lock for não reentrante. Os métodos de concurrency::reader_writer_lock::lock e de concurrency::reader_writer_lock::lock_read lança uma exceção do tipo improper_lock se forem chamadas por um thread que já é o proprietário do bloqueio.
Dica
Como a classe de reader_writer_lock for não reentrante, você não pode atualizar um bloqueio somente leitura a um bloqueio de leitor/gravador ou downgrade um bloqueio de leitor/gravador a um bloqueio somente leitura.Executando qualquer uma dessas operações gerencia o comportamento não especificado.
Métodos e recursos
A tabela a seguir mostra os métodos importantes que são definidos pela classe de reader_writer_lock .
Método |
Descrição |
---|---|
Adquire o acesso de leitura/gravação ao bloqueio. |
|
Tenta adquirir acesso de leitura/gravação ao bloqueio, mas não bloqueia. |
|
Adquire o acesso somente leitura ao bloqueio. |
|
Tenta adquirir acesso somente leitura ao bloqueio, mas não bloqueia. |
|
Libera o bloqueio. |
[Superior]
scoped_lock e scoped_lock_read
As classes de critical_section e de reader_writer_lock aninhadas fornecem as classes auxiliares que simplificam a maneira que você trabalha com objetos de exclusão mútua. Essas classes auxiliares são conhecidas como bloqueios o escopo.
A classe de critical_section contém a classe de concurrency::critical_section::scoped_lock . O construtor adquire o acesso ao objeto fornecido de critical_section ; o acesso das versões de destruidor a esse objeto. A classe de reader_writer_lock contém a classe de concurrency::reader_writer_lock::scoped_lock , que se assemelha a critical_section::scoped_lock, exceto que gerencia o acesso de gravação ao objeto fornecido de reader_writer_lock . A classe de reader_writer_lock também contém a classe de concurrency::reader_writer_lock::scoped_lock_read . Essa classe gerencia o acesso de leitura ao objeto fornecido de reader_writer_lock .
Os bloqueios o escopo do fornecem vários benefícios quando você estiver trabalhando com critical_section e reader_writer_lock objetos manualmente. Normalmente, você atribui um bloqueio no escopo da pilha. Um acesso o escopo das versões de bloqueio ao objeto de exclusão mútua automaticamente quando é destruído; consequentemente, você não desbloqueia manualmente o objeto subjacente. Isso é útil quando uma função contém várias instruções de return . Os bloqueios o escopo do também podem ajudar a escrever o código seguro. exceções gerais Quando uma instrução de throw faz com que a pilha desenrole, o destruidor para qualquer bloqueio ativo no escopo é chamado e, consequentemente o objeto de exclusão mútua sempre é liberado corretamente.
Dica
Quando você usa critical_section::scoped_lock, reader_writer_lock::scoped_lock, e classes de reader_writer_lock::scoped_lock_read , não liberar manualmente acesso ao objeto subjacente de exclusão mútua.Isso pode colocar o tempo de execução em um estado inválido.
evento
A classe de concurrency::event representa um objeto de sincronização cujo estado pode ser sinalizado ou não sinalizado. Diferentemente dos objetos de sincronização, como as seções críticos do, cujo propósito é proteger o acesso a dados compartilhados, os eventos sincronizam o fluxo de execução.
A classe de event é útil quando uma tarefa terminou do trabalho para outra tarefa. Por exemplo, uma tarefa pode sinalizar outra tarefa que lê dados de uma conexão de rede ou de um arquivo.
Métodos e recursos
A tabela a seguir mostra vários métodos importantes que são definidos pela classe de event .
Método |
Descrição |
---|---|
Aguarda até que o evento seja sinalizado. |
|
Define o evento no estado sinalizado. |
|
Define o evento no estado não sinalizado. |
|
Aguarda que vários eventos sejam sinalizados. |
Exemplo
Para obter um exemplo que mostra como usar a classe de event , considere Comparando estruturas de dados com a API do Windows.
[Superior]
Seções relacionadas
Comparando estruturas de dados com a API do Windows
Compara o comportamento das estruturas de dados de sincronização para aqueles fornecidos pela API do windows.Tempo de Execução de Simultaneidade
Descreve o tempo de execução de simultaneidade, o que simplifica a programação em paralelo, e contém links para os tópicos relacionados.