Compartilhar via


Componentes do thread-safe

Compartilhando recursos entre threads é uma necessidade freqüente em programação multissegmentada.Vários threads talvez precise acesso um banco de dados compartilhado, por exemplo, ou criar atualizações para um conjunto de variáveis do sistema.Quando mais de um thread compete simultaneamente para acesso a recursos compartilhados, a possibilidade de um condição de corrida ocorre.Existe uma condição de corrida quando um thread modifica um recurso para um estado inválido e, em seguida, outro thread tenta acesso desse recurso e usá-lo em estado inválido.Considere o exemplo a seguir:

Public Class WidgetManipulator
Public TotalWidgets as Integer = 0
Public Sub AddWidget()
   TotalWidgets += 1
   Console.WriteLine("Total widgets = " & TotalWidgets.ToString)
End Sub
Public Sub RemoveWidgets()
   TotalWidgets -= 10
End Sub
End Class
public class WidgetManipulator
{
   public int TotalWidgets = 0;
   public void AddWidget()
   {
      TotalWidgets++;
      Console.WriteLine("Total widgets = " + TotalWidgets.ToString());
   }
   public void RemoveWidgets()
   {
      TotalWidgets -= 10;
   }
}

Essa classe expõe dois métodos.Um método, AddWidget, adiciona 1 para o TotalWidgets campo e grava o valor para o console. O segundo método subtrai 10 do valor de TotalWidgets. Pense no que aconteceria se dois threads simultaneamente tentaram acesso a mesma instância do WidgetManipulator classe. Um segmento pode chamar AddWidget ao mesmo time que o segundo thread chamado RemoveWidgets. Nesse caso, o valor de TotalWidgets poderia ser alterado pelo segundo thread antes que um valor exato pode ser reportado pelo primeiro segmento. Essa condição de corrida pode causar resultados imprecisos sejam relatados e pode causar corrupção de dados.

Evitando condições de corrida por meio de bloqueios

Você pode proteger seções críticas do seu código contra condições de corrida, empregando bloqueios.Um bloquear, representado por de palavra-chave do Visual Basic demonstrativo SyncLockou a palavra-chave de translation from VPE for Csharp demonstrativo bloquear, permite que um único segmento de execução para obter direitos de execução exclusivo em um objeto.O exemplo a seguir demonstra como bloqueios:

SyncLock MyObject
' Insert code that affects MyObject.
End SyncLock
lock(MyObject)
{
   // Insert code that affects MyObject.
}

Quando um bloquear é encontrado, a execução no objeto especificado (MyObject no exemplo anterior) é bloqueado até que o thread pode tem acesso exclusivo ao objeto. Ao participante do bloquear é alcançado, o bloquear seja liberado e execução prosseguirá normalmente.Você só pode obter um bloquear em um objeto que retorna uma referência.Um tipo de valor não pode ser bloqueado dessa maneira.

Desvantagens dos bloqueios

Embora o uso de bloqueios garante que vários segmentos não acessem simultaneamente um objeto, podem causar degradação de desempenho significativos.Imagine um programa com muitos segmentos diferentes em execução.Se cada thread precisa usar um determinado objeto e tem de esperar para obter um bloquear exclusivo no objeto antes de executar, os threads irão todos cessar a execução e faça fazer backup atrás de outro, causando baixo desempenho.Por esses motivos, você só deve usar bloqueios quando você tem o código que deve ser executado sistema autônomo uma unidade.Por exemplo, você pode atualizar vários recursos que estavam interdependentes.Esse código é considerado atômica.Restringindo seus bloqueios apenas ao código que deve ser executado atomicamente permitirá que você escrever componentes multissegmentados garantam a segurança dos dados e ainda manter um mercadoria desempenho.

Você também deve ter cuidado para evitar situações em que deadlocks podem ocorrer.Nesse caso, vários threads Espere uns aos outros para liberar recursos compartilhados.Por exemplo, thread 1 talvez segure um bloquear em um recurso e está aguardando recurso B.Thread 2, por Outros lado, pode ter um bloquear no recurso B e aguarda recursos a.Nesse caso, nenhum thread terão permissão para continuar.A única maneira de evitar situações de deadlock é por meio de cuidado com programação.

Consulte também

Tarefas

Como: Coordenar vários threads de execução

Como: Manipular controles a partir de threads

Demonstra Passo a passo: Criação de um componente Multithreaded simples com o Visual Basic

Demonstra Passo a passo: Criação de um componente Multithreaded simples com translation from VPE for Csharp Visual

Conceitos

Com base em eventos Asynchronous Padrão Overview

Referência

BackgroundWorker

Outros recursos

Multithreading in Components