ID do artigo: 173260 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 4.5

Falha de sincronização quando estiver depurando

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sintomas

Threads aguardando um objeto de sincronização não podem ser lançados (por exemplo, por PulseEvent() ou uma combinação de SetEvent()/ResetEvent()) enquanto você está depurando um aplicativo no Windows NT.

Causa

Esse sintoma é uma anomalia relacionada ao ambiente de depuração em Win32. Ele só ocorrerá em um depurador Win32, incluindo qualquer versão do depurador do Visual C++ e do WinDBG.

Resolução

Colocar Sleep(0) antes que as chamadas PulseEvent() ou SetEvent()/ResetEvent() provavelmente irão evitar esse problema, mas isso não é garantia de um. Infelizmente, não há nenhuma solução alternativa garantida para essa situação.

Situação

Observe que esse sintoma não é um bug, mas em vez disso, um efeito colateral de depuração no Windows NT. Não existem planos para alterar esse comportamento atuais. Também é importante observar que este anomalias não ocorrerá fora de um ambiente de depuração.

Mais Informações

PulseEvent() pode falhar ao liberar um thread em espera em um objeto de evento enquanto o aplicativo está sendo executado em um ambiente de depuração. Isso é verdadeiro independentemente de estarem ou não o código é compilado com informações de depuração. Isso também é independentemente se o debuggee é executado pelo comando "Ir" ou pelo sendo "único passado"

O problema é mais provável de ocorrer se mais de um segmento está aguardando o mesmo evento. Falha ao liberar o segmento em espera se torna mais provável ainda se há eventos de depuração que ocorrem nesses threads, tais como aqueles causados por OutputDebugString(). Fazer uma chamada para OutputDebugString() diretamente antes de uma chamada para PulseEvent() é uma maneira eficaz de regularmente fazendo com que um segmento em espera não para acordar no ambiente de depuração.

Isso acontece porque o ambiente de depuração do Win32 normalmente suspende threads. Quando isso acontece, ele recebe o thread fora do seu estado atual e faz com que ele esperar em um evento de "suspender". Esse tipo de suspensão internamente acontece em cada evento de depuração. Quando reiniciado, os threads são colocados voltar em seu estado de espera anterior. Se o PulseEvent() ocorre enquanto um segmento está em um estado suspenso de depuração, a discagem de pulso é perdida para esse segmento. Isso também é verdadeiro de um thread suspenso pelo aplicativo usando SuspendThread().

Esse comportamento não está limitado a PulseEvent(). Threads aguardando são suscetíveis a "depuração suspender" em outros cenários Além disso, incluindo um par de SetEvent()/ResetEvent() rápido.

Como mencionado acima, uma possível solução para esse problema é colocar uma chamada Sleep(0) antes de qualquer chamada PulseEvent() ou SetEvent(). Este procedimento resolve o problema na maioria dos casos, porque ele permite que segmentos sendo reiniciado uma oportunidade para iniciar aguardando novamente.

É importante observar que este anomalias não ocorrerá fora de um ambiente de depuração.

A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 nas seguintes plataformas
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows XP Professional
    • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
    • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
    • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
    • Microsoft Windows Server 2003, Web Edition
    • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
    • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
    • Microsoft Windows Server 2003, Standard x64 Edition
    • Microsoft Windows Server 2003, Enterprise x64 Edition
    • Microsoft Windows Server 2003, Datacenter x64 Edition
    • Windows Vista Home Basic
    • Windows Vista Home Premium
    • Windows Vista Enterprise
    • Windows Vista Business
    • Windows Vista Ultimate
    • Windows Vista Starter
    • Windows Vista Business 64-bit edition
    • Windows Vista Home Premium 64-bit edition
    • Windows Vista Home Basic 64-bit edition
    • Windows Vista Ultimate 64-bit edition
    • Windows Vista Enterprise 64-bit edition
    • Windows Server 2008 Standard
    • Windows Server 2008 Enterprise
    • Windows Server 2008 Datacenter
    • Windows Server 2008 for Itanium-Based Systems
    • Windows Web Server 2008
Palavras-chave: 
kbmt kbapi kbbug kbdebug kbeventlog kbkernbase kbprb kbthreadsync KB173260 KbMtpt
Tradução automáticaTraduçã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: 173260  (http://support.microsoft.com/kb/173260/en-us/ )