Sincronizando dados de Multithreading

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

O Common Language Infrastructure fornece várias estratégias para sincronizar o acesso a membros estáticos e de instância:

  • Regiões de código sincronizadas. Você pode usar o Monitor classe ou o compilador de suporte para esta classe sincronizar somente o bloco de código que precisa, melhorando o desempenho.

  • Sincronização manual. Você pode usar os objetos de sincronização fornecidos pelo.Biblioteca de classes do NET Framework. Consulte 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 simple e automática para ContextBoundObject objetos.

  • Coleção de classes de System.Collections.Concurrent namespace. Essas classes fornecem internos sincronizados, adicionar e remover operações. Para obter mais informações, consulte Coleções de thread-Safe..

O common language runtime fornece um modelo de thread no qual classes dividem-se em um número de categorias que podem ser sincronizados em uma variedade de maneiras diferentes, dependendo dos requisitos. A tabela a seguir mostra que suporte a sincronização é fornecido para os campos e métodos com uma categoria de sincronização de determinado.

<strong>Categoria</strong>

Campos globais

Campos estáticos

Métodos estáticos

Campos de instância

Métodos de instância

Blocos de código específico

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 thread pode acessar qualquer método ou campo a qualquer momento. Apenas um thread por vez deve acessar esses objetos.

Sincronização manual

A.NET Framework class library fornece um número de 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 classe ou uma palavra-chave do compilador para sincronizar os blocos de código, métodos de instância e métodos estáticos. Não há nenhum suporte para os campos estáticos sincronizados.

A marcação de blocos de código com uma palavra-chave de idioma específico, suportem a Visual Basic e C# a lock instrução em C# ou o SyncLock instrução em Visual Basic. Quando o código é executado por um segmento, haverá uma tentativa de adquirir o bloqueio. Se o bloqueio já tiver sido adquirido por outro thread, os blocos de segmento até o bloqueio se torna disponível. Quando o thread sai do bloco sincronizado de código, o bloqueio 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, para que outros métodos de Monitor pode ser usado em conjunto com eles dentro da região sincronizados.

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

Thread.Interruptpode ser usado para quebrar um encadeamento de bloqueio de operações como, por exemplo, aguardando o acesso a uma região sincronizado de código. Thread.Interrupt também é usado para quebrar os encadeamentos de operações, como Thread.Sleep.

Observação importanteImportante

Não bloquear o tipo — ou seja, typeof(MyType) na C# GetType(MyType) em Visual Basic, ou MyType::typeid em C++ — a fim de proteger static métodos (Shared métodos em Visual Basic).Use um objeto estático privado.Da mesma forma, não use this em C# (Me em Visual Basic) para métodos de instância de bloqueio.Use um objeto particular.Uma classe ou instância pode ser bloqueada pelo código diferente de sua preferência, podendo causar deadlocks ou problemas de desempenho.

Suporte a compilador

Visual Basic e C# oferecem suporte a uma palavra-chave do idioma que usa Monitor.Enter e Monitor.Exit para bloquear o objeto. Oferece suporte a Visual Basic a SyncLock instrução; C# oferece suporte a lock instrução.

Em ambos os casos, se uma exceção é lançada no código bloquear, o bloqueio adquirido pela lock ou SyncLock é liberado automaticamente. Os compiladores de C# e Visual Basic de emitem um tente/Finalmente bloquear com Monitor. Enter no início de try, e Exit na Finalmente bloco. Se uma exceção é lançada dentro do lock ou SyncLock bloco, o Finalmente executa o manipulador para que você possa fazer qualquer trabalho de limpeza.

Contexto sincronizado

Você pode usar o SynchronizationAttribute em qualquer ContextBoundObject para sincronizar todos os campos e métodos de instância. Todos os objetos no mesmo domínio do contexto compartilham o mesmo bloqueio. 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

Referência

Instrução SyncLock

<>bloqueio de>instrução (referência de TRANSLATION FROM VPE FOR CSHARP)

SynchronizationAttribute

Conceitos

Segmentos e Threading

Visão geral dos primitivos de sincronização