Débogage d'une condition de concurrence : le piège de RtlRunOnceExecuteOnce
Un collègue a rencontré un problème de concurrence délicat lors d'une session de débogage hebdomadaire : une section critique n'a pas réussi à empêcher deux threads d'entrer dans le même bloc de code, ce qui a entraîné une double inscription erronée de `TraceLoggingRegister`. Un débogage approfondi a révélé la cause racine : la fonction d'initialisation `InitializeCriticalSectionOnce` pour `RtlRunOnceExecuteOnce` a renvoyé incorrectement `STATUS_SUCCESS` (0). Cela a amené `RtlRunOnceExecuteOnce` à croire que l'initialisation avait échoué, ce qui l'a fait réinitialiser la section critique à chaque appel, déclenchant ainsi la condition de concurrence. La solution a consisté à modifier la valeur de retour en `TRUE`, ou plus élégamment, à remplacer `CRITICAL_SECTION` par `SRWLOCK`. Ce cas souligne à quel point des erreurs subtiles de valeur de retour peuvent avoir des conséquences graves et souligne l'importance du choix d'une primitive de synchronisation appropriée.