Depurando uma condição de corrida: a armadilha do RtlRunOnceExecuteOnce

2025-03-23
Depurando uma condição de corrida: a armadilha do RtlRunOnceExecuteOnce

Um colega encontrou um problema complicado de concorrência durante uma sessão semanal de depuração: uma seção crítica falhou em impedir que duas threads entrassem no mesmo bloco de código, levando a uma falha de registro duplo do `TraceLoggingRegister`. A depuração aprofundada revelou a causa raiz: a função de inicialização `InitializeCriticalSectionOnce` para `RtlRunOnceExecuteOnce` retornou incorretamente `STATUS_SUCCESS` (0). Isso levou `RtlRunOnceExecuteOnce` a acreditar que a inicialização falhou, fazendo com que ele re-inicializasse a seção crítica a cada chamada, acionando a condição de corrida. A solução foi alterar o valor de retorno para `TRUE`, ou mais elegantemente, substituir `CRITICAL_SECTION` por `SRWLOCK`. Este caso destaca como erros sutis de valor de retorno podem levar a consequências graves e sublinha a importância de escolher o primitivo de sincronização apropriado.

Desenvolvimento