경쟁 조건 디버깅: RtlRunOnceExecuteOnce 함정

2025-03-23
경쟁 조건 디버깅: RtlRunOnceExecuteOnce 함정

동료가 주간 디버깅 세션에서 다루기 어려운 동시성 문제를 만났습니다. 크리티컬 섹션이 두 개의 스레드가 동일한 코드 블록에 진입하는 것을 막지 못하여 `TraceLoggingRegister`의 이중 등록 오류가 발생했습니다. 심층 디버깅을 통해 근본 원인이 밝혀졌습니다. `RtlRunOnceExecuteOnce`의 초기화 함수 `InitializeCriticalSectionOnce`가 `STATUS_SUCCESS`(0)를 잘못 반환했습니다. 이로 인해 `RtlRunOnceExecuteOnce`는 초기화에 실패했다고 판단하고 매번 크리티컬 섹션을 다시 초기화하여 경쟁 조건을 발생시켰습니다. 해결책은 반환값을 `TRUE`로 변경하거나, 더욱 효율적으로 `CRITICAL_SECTION`을 `SRWLOCK`으로 대체하는 것입니다. 이 사례는 반환값의 미세한 오류가 심각한 결과로 이어질 수 있음을 보여주며, 적절한 동기화 프리미티브를 선택하는 것이 중요함을 강조합니다.

개발