Select the product you need help with
Descrição das condições de corrida e deadlocksID do artigo: 317723 - Exibir os produtos aos quais esse artigo se aplica. Nesta páginaSumárioVisual Basic .NET ou Visual Basic 2005 oferece a capacidade de usar threads em aplicativos Visual Basic pela primeira vez. Segmentos apresentam problemas de depuração como condições de corrida e deadlocks. Este artigo explora esses dois problemas. Mais InformaçõesCondições de corridaUma condição de corrida ocorre quando dois threads acessem uma variável compartilhada ao mesmo tempo. O primeiro thread lê a variável, e o thread de segundo lê o mesmo valor da variável. Em seguida, o thread primeiro e segundo thread executar suas operações no valor e eles corrida para ver qual thread pode gravar o valor última variável compartilhada. O valor do thread que grava o valor última é preservado, porque o thread está escrevendo sobre o valor que escreveu o segmento anterior.Exemplo e detalhesCada thread é alocada de um período de tempo para executar em um processador predefinido. Quando o tempo que está alocado para o segmento expira, o contexto do thread é salvo até a próxima vez no processador e o processador começa a execução do próximo segmento.Como um comando de uma linha pode causar uma condição de corrida? Examine o exemplo a seguir para ver como uma condição de corrida ocorre. Há dois threads, e ambos estiverem atualizando uma variável compartilhada chamada total (que é representado como dword ptr ds: [031B49DCh] no código de assembly). Código do Visual Basic: Total é 100, val1 é 50 e val2 é 15. O thread 1 obtém uma oportunidade para executar, mas somente conclui as etapas de 1 a 3. Isso significa que o thread 1 ler a variável e concluída a adição. Segmento 1 agora é só esperando para gravar o novo valor de 150. Depois thread 1 for interrompido, o thread 2 obtém para executar completamente. Isso significa que ele escreveu o valor que ela calculada (85) saída para o total de variável. Finalmente, o thread 1 recupera o controle e terminar a execução. Ele escreve seu valor (150). Portanto, quando thread 1 for concluído, o valor do total agora é 150 em vez de 85. Você pode ver como isso pode ser um grande problema. Se isso fosse um programa bancário, o cliente teria dinheiro em sua conta não deve estar presente. Este erro é aleatório, porque é possível para o thread 1 concluir sua execução antes de seu tempo no processador expira e, em seguida, o thread 2 pode começar sua execução. Se esses eventos ocorrem, o problema não ocorre. Execução de thread é não determinístico, portanto você não pode controlar o tempo ou ordem de execução. Observe também que os threads podem executar diferente em tempo de execução versus o modo de depuração. Além disso, você pode ver que se você executar cada thread na série, o erro não ocorrerá. Este aleatoriedade torna muito mais difícil rastrear e depurar esses erros. Para evitar que as condições de corrida ocorra, você pode bloquear variáveis compartilhadas, para que apenas um thread por vez tenha acesso à variável compartilhada. Para fazer isso com moderação, pois se uma variável está bloqueada no thread 1 e thread 2 também precisa a variável, a execução do thread 2 pára enquanto aguarda thread 2 para o thread 1 liberar a variável. (Para obter mais informações, consulte "SyncLock" na seção "Referências" deste artigo.) SintomasO sintoma mais comum de uma condição de corrida é imprevisíveis valores de variáveis que são compartilhadas entre vários threads. Isso resulta de imprevisibilidade da ordem na qual os threads executar. Wins de um thread de um dia e um dia outros wins de thread. Em outros momentos, execução funciona corretamente. Além disso, se cada thread é executada separadamente, o valor da variável funciona corretamente.DeadlocksUm deadlock ocorre quando dois threads cada bloqueio uma variável diferente ao mesmo tempo e, em seguida, tenta bloquear a variável que outro thread já está bloqueado. Como resultado, cada thread pára de executar e aguarda o outro segmento liberar a variável. Como cada thread está mantendo a variável que deseja que o outro thread, nada ocorre, e os segmentos permanecem deadlocked.Exemplo e detalhesO código a seguir possui dois objetos, LeftVal e RightVal:Um deadlock sempre não ocorre. Se o thread 1 executa os dois bloqueios antes do processador interrompe, thread 1 pode executar suas operações e, em seguida, desbloquear variável compartilhada. Após 1 thread desbloqueia a variável, thread 2 pode prosseguir com sua execução, conforme o esperado. Este erro parece óbvio quando esses trechos de código são colocados lado a lado, mas na prática, o código pode aparecer em módulos separados ou áreas de seu código. Esse um erro muito difícil rastrear porque, do código mesmo, tanto execução correta execução incorreta podem ocorrer. SintomasUm sintoma comum de deadlock é que o programa ou grupo de threads pára de responder. É também conhecido como uma paralisação . Pelo menos dois threads são cada uma variável que outro thread bloqueado aguardando. Os segmentos não continue, porque nenhum thread irá lançar sua variável até que ele obtém a outra variável. O programa inteiro pode paralisar se o programa está aguardando um ou ambos os threads para execução completa.O que é um thread?Processos são usados para separar os diferentes aplicativos que estão em execução em um horário especificado em um único computador. O sistema operacional não executa processos, mas fazer threads. Um segmento é uma unidade de execução. O sistema operacional aloca tempo do processador para um segmento para a execução de tarefas do thread. Um único processo pode conter vários threads de execução. Cada thread mantém seus próprio manipuladores de exceção, prioridades e um conjunto de estruturas que o sistema operacional usa para salvar o contexto do thread, se o thread não é possível concluir sua execução durante o tempo em que foi atribuída para o processador de agendamento. O contexto é mantido até a próxima vez que o thread recebe o tempo do processador. O contexto inclui todas as informações que o thread requer para perfeitamente continuar sua execução. Essas informações incluem conjunto do segmento de registradores do processador e a pilha de chamada dentro o espaço de endereço do processo de host.ReferênciasPara obter mais informações, procure Ajuda do Visual Studio para as seguintes palavras-chave:
316422 Para obter mais informações, consulte o seguinte site da MSDN:
(http://support.microsoft.com/kb/316422/EN-US/
)
INFO: Guia para Threading no Visual Basic .NET Threads and Threading
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthreadsthreading.asp)
PropriedadesID do artigo: 317723 - Última revisão: quarta-feira, 6 de dezembro de 2006 - Revisão: 2.3 A informação contida neste artigo aplica-se a:
Tradução automática IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado. Clique aqui para ver a versão em Inglês deste artigo: 317723
(http://support.microsoft.com/kb/317723/en-us/
)
| Traduções deste artigo |




Voltar para o início








