Artigo: 173260 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 4.5

Falha de sincronização durante a depuração

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 | Reduzir tudo

Sintomas

Não podem ser libertados threads à espera de um objecto de sincronização (por exemplo, por PulseEvent() ou uma combinação de SetEvent()/ResetEvent()) enquanto estiver a depurar uma aplicação no Windows NT.

Causa

Este sintoma é uma anomalia relacionadas com o ambiente de depuração no Win32. Só ocorrerá num depurador Win32, incluindo qualquer versão do depurador do Visual C++ e WinDBG.

Resolução

Colocar Sleep(0) antes das chamadas PulseEvent() ou SetEvent()/ResetEvent(), provavelmente, irão evitar este problema, mas este não é garantida uma. Infelizmente, não existe não solução garantia para esta situação.

Ponto Da Situação

Tenha em atenção que este sintoma não é um erro, mas sim um efeito de lado de depuração no Windows NT. Existem existem planos para alterar este comportamento actuais. Também é importante ter em atenção que esta anomalia não ocorrerá fora de um ambiente de depuração.

Mais Informação

PulseEvent() poderá não conseguir libertar um thread em espera um objecto de evento enquanto a aplicação está em execução num ambiente de depuração. Isto acontece independentemente se o código é compilado com informações de depuração. Este é também independentemente se o elemento depurado é executado o comando "ir" ou ser "único utilizado."

O problema é mais provável se mais do que um thread está à espera do mesmo evento. Falha ao lançar o thread em espera torna-se mais provável que ainda se não existirem eventos de depuração que ocorram nestes threads, tais como os causado por OutputDebugString(). Efectuar uma chamada para OutputDebugString() directamente antes de uma chamada para PulseEvent() é uma forma eficaz de regularmente a causar um thread em espera não para acordar no ambiente de depuração.

Isto acontece porque o ambiente de depuração Win32 normalmente suspende threads. Quando isto acontecer, solicita o thread fora do respectivo estado actual e causa a aguardar num evento "suspender". Este tipo de suspensão internamente acontece em todos os eventos de depuração. Quando retomar, os threads são colocados novamente para o estado de espera anterior. Se o PulseEvent() ocorre enquanto um thread está num estado suspenso de depuração, a marcação por impulsos é perdida para esse thread. Isto também acontece de um thread suspenso pela aplicação utilizando SuspendThread().

Este comportamento não está limitado a PulseEvent(). Aguardar threads são susceptíveis à "depuração suspender" em outros cenários, incluindo um par de SetEvent()/ResetEvent() rápido.

Tal como mencionado anteriormente, uma possível solução para este problema consiste em colocar uma chamada Sleep(0) antes de qualquer chamada PulseEvent() ou SetEvent(). Isto resolve o problema na maioria dos casos, porque permite a ser retomado uma oportunidade para iniciar novamente a aguardar threads.

É importante ter em atenção que esta anomalia não ocorrerá fora de um ambiente de depuração.

A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface nas seguintes plataformas
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows XP Professional Edition
    • Microsoft Windows Server 2003 Standard Edition
    • Microsoft Windows Server 2003 Enterprise Edition
    • Microsoft Windows Server 2003 Datacenter Edition
    • 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )