Falha específica do Windows 10 na chamada LeaveCriticalSection

Eu encontrei um problema com a sincronização de threads e seções críticas no Windows 10.

O aplicativo falhará neste caso:

Aplicativo possui dois threads.O segmento 1 chama EnterCriticalSection com o objeto m_CSO segmento 2 tenta entrar na mesma seção críticaO segmento 1 encerra o segmento 2 usando TerminateThreadO segmento 1 chama LeaveCriticalSection

Nas versões anteriores do Windows, que eu era capaz de testar (7, 8, 8.1), isso funciona corretamente. O segmento 2 termina e o segmento 1 deixa a seção crítica sem exceção.

No Windows 10, quando o Thread 1 sai da seção crítica, o aplicativo trava com a Violação de Acesso. Isso só acontece quando outro encadeamento foi encerrado enquanto aguardava EnterCriticalThread.

Olhando para o rastreio da pilha, parece o seguinte (último quadro na parte superior):

RtlpWakeByAddress
RtlpUnWaitCriticalSection
RtlLeaveCriticalSection

Passei tanto tempo depurando esse problema. No meu caso, m_CS é totalmente bom quando o LeaveCriticalSection foi chamado. Eu depurei e passei algum tempo para analisar o código desmontado das funções ntdll.dll. Parece que o objeto corrompe em algum lugar durante a execução de RtlpUnWaitCriticalSection e depois é passado para RtlpWakeByAddress quando ocorre uma falha. Basicamente, o ntdll.dll conseguiu modificar as propriedades do objeto CRITICAL_SECTION, como a contagem de bloqueios em RtlLeaveCriticalSection.

Na web, não encontrei nenhuma resposta sobre isso ou declaração sobre o que mudou no Windows 10. Somente encadear relatórios de falhas no reddit e ~ 1800 para o Mozilla Firefox com a mesma pilha de chamadas no mês passado. Entrei em contato com o autor do post no reddit e ele não foi capaz de corrigir isso até agora.

Então, alguém lidou com esse problema e pode ter uma correção ou conselhos? Como solução agora, só repenso o uso do WinAPI TerminateThread e tento evitá-lo o máximo possível. Outra maneira é provavelmente refatorar um código e pensar na arquitetura do aplicativo.

Qualquer resposta apreciada. desde já, obrigado

questionAnswers(3)

yourAnswerToTheQuestion