Partilhar via


Componentes thread-safe

Compartilhar recursos entre segmentos é uma necessidade freqüente em programação multithread.Vários segmentos podem precisar acessar um banco de dados compartilhado, por exemplo, ou fazer atualizações em um conjunto de variáveis do sistema.Quando mais de um segmento simultaneamente compete para acesso aos recursos compartilhados, a possibilidade de uma condição de corrida ocorre.Uma condição de corrida existir quando um segmento alterar um recurso em um estado inválido, e então outro segmento tenta acessar esse recurso e usá-lo no 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 campo de TotalWidgets e grava o valor no console.O segundo método subtrai 10 do valor de TotalWidgets.Considere o que aconteceria se duas threads simultaneamente tentaram acessar a mesma instância de classe de WidgetManipulator .Um segmento pode chamar AddWidget ao mesmo tempo que o segundo segmento chamado RemoveWidgets.Em esse caso, o valor de TotalWidgets pode ser alterado pelo segundo segmento antes que um valor exato pode ser reportado pelo primeiro segmento.Essa condição de corrida pode causar resultados incorretas a ser reportado e pode causar danos de dados.

Evitando condições de corrida usando bloqueios

Você pode proteger seções importantes do seu código das condições de corrida empregando bloqueios.Um bloqueio, representado pela palavra-chave Instrução SyncLockdo Visual Basic, ou a palavra-chave instrução de bloqueioC#, permitem que um único thread de execução obter permissões exclusivos de execução em um objeto.O exemplo a seguir demonstra bloqueios:

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

Quando um bloqueio é localizado, a execução no objeto especificado (MyObject no exemplo anterior) é bloqueada até que o segmento possa obter acesso exclusivo ao objeto.Quando o final do bloqueio é alcançada, o bloqueio será liberado e execução das normalmente.Você só pode obter um bloqueio em um objeto que retorna uma referência.Um tipo de valor não pode ser bloqueado esse modo.

a8544e2s.collapse_all(pt-br,VS.110).gifDesvantagens de bloqueios

Embora usar bloqueios garantir que vários segmentos não acessam simultaneamente um objeto, eles pode causar degradação de desempenho significativa.Imagine um programa com executar diferente de vários segmentos.Se cada segmento precisar usar um objeto específico e tem que aguardar para obter um bloqueio exclusivo no objeto antes de executar, todos os segmentos cessarão de executar e irão backup de apoio outro, causando o desempenho ruim.Por esses motivos, você deve usar bloqueios quando você tem o código que será executado como uma unidade.Por exemplo, você pode atualizar vários recursos que foram interdependentes.Esse código é atômico.Restringir os bloqueios para somente o código que devem ser executados atomic que permitirá que você escreva os componentes multissegmentados que asseguram a segurança dos seus dados enquanto ainda manter bom desempenho.

Você também deve ter cuidado para evitar as situações onde as deadlocks podem ocorrer.Em esse caso, várias threads esperam se para liberar recursos compartilhados.Por exemplo, o segmento 1 pode conter um bloqueio em A recursos e está aguardando o recurso B.O segmento 2, por outro lado, pode ter um bloqueio no recurso B e espera o recurso para o.Em tais casos, nenhum segmento será permitido continuar.A única maneira para evitar situações de bloqueio é completa com programação cuidadosa.

Consulte também

Tarefas

Como: Vários segmentos de coordenadas de execução

Como: Manipular controles de segmentos

Passo a passo: Criando um componente com simples com Visual Basic

Passo a passo: Criando um componente com simples com o visual C#

Referência

BackgroundWorker

Conceitos

Event-based Asynchronous Pattern Overview

Outros recursos

Multithreading em componentes