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.
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 |
---|---|
Adquire a seção crítica.Os blocos de contexto chamada até que adquire o bloqueio. |
|
Tenta adquirir a seção crítica, mas não bloqueia. |
|
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çã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. |
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 |
---|---|
Adquire o acesso de leitura/gravação para o bloqueio. |
|
Tenta adquirir acesso de leitura/gravação para o 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. |
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çã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.
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 |
---|---|
Aguarda o evento ficar sinalizado. |
|
Define o evento para o estado sinalizado. |
|
Define o evento para o estado não sinalizado. |
|
Aguarda vários eventos ficar sinalizado. |
Exemplo
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
Comparando estruturas de dados de sincronização à API
Compara o comportamento das estruturas de dados de sincronização aos fornecidos pela API do Windows.Tempo de execução de concorrência
Descreve o Runtime de simultaneidade, que simplifica a programação paralela e contém links para tópicos relacionados.