致命Bug追踪:一个RtlRunOnceExecuteOnce的陷阱
2025-03-23

一位同事在每周的调试例会上遇到一个棘手的并发问题:关键代码段未能阻止两个线程同时进入,导致TraceLoggingRegister重复注册失败。深入调试发现,问题源于`RtlRunOnceExecuteOnce`的初始化函数`InitializeCriticalSectionOnce`错误地返回了`STATUS_SUCCESS` (0),导致`RtlRunOnceExecuteOnce`认为初始化失败,每次调用都重新初始化临界区,从而引发并发问题。最终解决方案是将返回值改为`TRUE`,或者更简洁地用`SRWLOCK`代替`CRITICAL_SECTION`。这个案例警示了细微的返回值错误可能导致严重后果,并强调了选择合适的同步原语的重要性。