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:
Regiões de código sincronizadas.Você pode usar o Monitor suporte de classe ou o compilador para esta classe sincronizar somente o bloco de código que precisa dele, melhorando o desempenho.
Sincronização manual. Você pode usar os objetos de sincronização fornecidos pelo .NET estrutura classe biblioteca.See Visão geral dos primitivos de sincronização, que inclui uma discussão sobre o Monitor classe.
Contextos sincronizados.Você pode usar o SynchronizationAttribute Para habilitar a sincronização simples e automático para ContextBoundObject objetos.
Synchronized propriedade. Algumas classes, sistema autônomo Hashtable e Queue, fornecem um Synchronized propriedade que retorna um wrapper thread-safe para uma instância da classe. See Coleções e sincronização (acesso thread-safe).
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
Visão geral dos primitivos de sincronização