Définition
Une faute de concurrence où le comportement ou le résultat d'un programme dépend du timing relatif ou de l'ordre d'exécution des opérations sur des ressources partagées, de sorte que différents intercalages produisent des résultats différents, dont certains peuvent être incorrects ou dangereux.

Principe

Principe
Lorsque plusieurs agents concurrents (threads, processus, interruptions) accèdent à un état partagé et qu'au moins un le modifie sans synchronisation appropriée, l'absence d'ordre défini rend les résultats non déterministes et sensibles au planificateur, aux caches ou aux E/S.

Démonstration

Démonstration
Deux threads incrémentent un compteur partagé en lisant, incrémentant puis écrivant sans opérations atomiques ni verrous ; les intercalages peuvent faire perdre des incréments (mises à jour perdues). Un TOCTOU classique survient lorsqu'on vérifie l'existence d'un fichier puis qu'on l'utilise, et qu'un autre thread modifie le fichier entre contrôle et utilisation.

Mauvaise application

Mauvaise application
Employer 'condition de course' pour désigner tout bogue intermittent sans démontrer d'interaction dépendant du temps, ou supposer que l'ajout de sleeps reproduira ou résoudra le problème ; croire aussi que les verrous suppriment toujours le risque sans considérer blocages (deadlocks) ou inversion de priorité.

Conséquence

Conséquence
Reconnaître correctement les conditions de course conduit à une synchronisation appropriée (verrous, atomiques, transactions) ou à un redesign par immuabilité, produisant un comportement déterministe ; si elles restent non résolues elles provoquent des défaillances intermittentes, une corruption de données ou des vulnérabilités difficiles à reproduire.

Inversion

Inversion
Sérialiser l'accès à la ressource partagée, utiliser des primitives atomiques, passer des messages ou concevoir des structures immuables inverse la nondéterminisme en imposant un ordre bien défini ou en éliminant l'état mutable partagé.

Limite

Limite
Inclut les data races et les conditions de course d'ordre supérieur ; se distingue du deadlock et du livelock (où le progrès s'arrête ou tourne en rond) et de la non‑déterminisme algorithmique pur qui ne provient pas d'accès partagé non synchronisés.

Tension sémantique

Tension sémantique
La tension existe entre 'data race' (accès mémoire bas niveau non synchronisé) et 'condition de course' plus large (qui peut inclure l'ordre d'opérations de niveau supérieur). Il y a aussi une tension à décrire la nondéterminisme observé comme dû à la concurrence plutôt qu'à une cause environnementale.

Synthèse

Synthèse
Une condition de course est une faute liée au timing où l'accès non synchronisé à un état partagé produit des résultats non déterministes et potentiellement incorrects ; elle se manifeste par des mises à jour perdues ou des TOCTOU, est mal attribuée si le timing n'est pas démontré et se corrige par synchronisation, atomiques ou réingénierie pour restaurer le déterminisme.