Sincronizando dados para o multithreading

Quando vários segmentos podem fazer chamadas para as propriedades e métodos de um único objeto, é importante que essas chamadas estar sincronizados.Caso contrário, um thread pode interromper o outro thread está fazendo e o objeto pode ser deixado em estado inválido.Uma classe cujos membros são protegidos contra essas interrupções é chamada thread-safe.

O Common linguagem Infrastructure fornece diversas estratégias para sincronizar o acesso a membros estático e de instância:

O common linguagem tempo de execução fornece um modelo de thread no qual classes dividem-se em um número de categorias que podem ser sincronizadas de várias maneiras diferentes dependendo dos requisitos.A tabela a seguir mostra que suporte a sincronização é fornecido para campos e métodos com uma sincronização determinada categoria.

Category (Categoria)

Campos global

Campos estático

Métodos estático

Campos de instância

Métodos de instância

Blocos de código específica

Nenhuma sincronização

Não

Não

Não

Não

Não

Não

Contexto sincronizado

Não

Não

Não

Sim

Sim

Não

Regiões de código sincronizadas

Não

Não

Somente se tiver marcado

Não

Somente se tiver marcado

Somente se tiver marcado

Sincronização manual

Manual

Manual

Manual

Manual

Manual

Manual

Nenhuma sincronização

Este é o padrão para objetos.Qualquer segmento pode acesso qualquer método ou campo a qualquer momento.Apenas um thread por vez deve acessar esses objetos.

Sincronização manual

Biblioteca de classes do .NET estrutura fornece várias classes para sincronização de threads.Consulte Visão geral dos primitivos de sincronização.

Regiões de código sincronizadas

Você pode usar o Monitor a classe ou uma palavra-chave de compilador para sincronizar os blocos de código, métodos de instância e métodos estático. Não há nenhum suporte para campos estático sincronizados.

Tanto o Visual Basic quanto translation from VPE for Csharp oferecem suporte a marcação de blocos de código com uma palavra-chave do linguagem em particular, a lock demonstrativo no translation from VPE for Csharp ou o SyncLock demonstrativo no Visual Basic. Quando o código é executado por um segmento, é feita uma tentativa para adquirir o bloquear.Se o bloquear já tiver sido adquirido por outro thread, os blocos de thread até que o bloquear se torne disponível.Quando o segmento é encerrado no bloco sincronizado de código, o bloquear será liberado, independentemente de como o thread sai do bloco.

Observação:

O lock e SyncLock instruções são implementadas usando Monitor.Enter e Monitor.Exit, portanto, outros métodos de Monitor pode ser usado em conjunto com-as dentro da região sincronizado.

Você também pode Decore um método com um MethodImplAttribute and MethodImplOptions.Synchronized, que tem o mesmo efeito que usar Monitor ou uma das palavras-chave compilador para bloquear todo o corpo do método.

Thread.Interrupt pode ser usada para quebrar um thread de bloqueio de operações sistema autônomo, por exemplo, aguardando o acesso a uma região sincronizado de código. Thread.interrupção também é usado para dividir segmentos de operações, como Thread.Sleep.

Observação importante:

Não bloquear o tipo — ou seja, typeof(MyType) em translation from VPE for Csharp, GetType(MyType) no Visual Basic, ou MyType::typeid no C++ – para proteger static () métodosShared métodos no Visual Basic). Use um objeto estático privado.Da mesma forma, não use this no () translation from VPE for CsharpMe no Visual Basic) para bloquear os métodos de instância. Use um objeto particular.Uma classe ou instância pode ser bloqueada pelo código Outros não a sua própria, podendo causar deadlocks ou problemas de desempenho.

Suporte do compilador

Tanto o Visual Basic quanto translation from VPE for Csharp oferecem suporte a uma palavra-chave de linguagem que usa Monitor.Enter e Monitor.Exit para bloquear o objeto. Visual Basic oferece suporte a SyncLock demonstrativo; translation from VPE for Csharp suporta o bloquear demonstrativo.

Em ambos os casos, se uma exceção é lançada no código bloquear, o bloqueio adquirido pela bloqueio or SyncLock é liberada automaticamente.Os compiladores translation from VPE for Csharp e Visual Basic emitem um Tente/Por fim bloco com Monitor.Enter no início de try e Monitor.sair in the Por fim bloco.Se uma exceção é lançada dentro de bloquear or SyncLock Bloco de a Por fim manipulador será executado para que você possa fazer qualquer trabalho de limpeza.

Contexto sincronizado

Você pode usar o SynchronizationAttribute on any ContextBoundObject para sincronizar todos os campos e métodos de instância.Todos os objetos no mesmo contexto de domínio compartilham o mesmo bloquear.Vários threads têm permissão para acessar os métodos e campos, mas somente um único segmento é permitido a qualquer momento.

Consulte também

Conceitos

Segmentos e Threading

Visão geral dos primitivos de sincronização

Referência

Instrução SyncLock

bloquear instrução (Referência C#)

SynchronizationAttribute