Debugging eines Race Conditions: Die RtlRunOnceExecuteOnce-Falle

2025-03-23
Debugging eines Race Conditions: Die RtlRunOnceExecuteOnce-Falle

Ein Kollege stieß während einer wöchentlichen Debugging-Sitzung auf ein kniffliges Nebenläufigkeitsproblem: Ein kritischer Abschnitt verhinderte nicht, dass zwei Threads denselben Codeblock betraten, was zu einem fehlerhaften Doppelaufruf von `TraceLoggingRegister` führte. Eine gründliche Fehlersuche ergab die Ursache: Die Initialisierungsfunktion `InitializeCriticalSectionOnce` für `RtlRunOnceExecuteOnce` gab fälschlicherweise `STATUS_SUCCESS` (0) zurück. Dies führte dazu, dass `RtlRunOnceExecuteOnce` davon ausging, die Initialisierung sei fehlgeschlagen, und den kritischen Abschnitt bei jedem Aufruf erneut initialisierte, wodurch die Race Condition ausgelöst wurde. Die Lösung bestand darin, den Rückgabewert auf `TRUE` zu ändern oder eleganter, `CRITICAL_SECTION` durch `SRWLOCK` zu ersetzen. Dieser Fall verdeutlicht, wie subtile Fehler im Rückgabewert zu schwerwiegenden Folgen führen können und unterstreicht die Bedeutung der Auswahl der richtigen Synchronisierungsprimitive.

Entwicklung