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 |
---|---|
Adquire a seção crítica. Os blocos de contexto chamada até que ele adquire o bloqueio. |
|
Tenta adquirir a seção crítica, mas não bloqueia. |
|
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çã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 |
---|---|
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. |
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çã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 |
---|---|
Espera-se para o evento ficar sinalizado. |
|
Define o evento para o estado sinalizado. |
|
Define o evento para o estado não sinalizado. |
|
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
Comparando as estruturas de dados de sincronização para a API do Windows.
Compara o comportamento das estruturas de dados de sincronização aos fornecidos pela API do Windows.Runtime de simultaneidade
Descreve o Runtime de simultaneidade, que simplifica a programação paralela e contém links para tópicos relacionados.