# Situation de compétition

Une situation de compétition (ou situation de concurrence, accès concurrent, concurrence critique, course critique, séquencement critique ; race condition en anglais, littéralement « situation de course »), est une situation caractérisée par un résultat différent selon l'ordre dans lequel agissent les acteurs du système. Le terme est plutôt employé à propos de programmes informatiques et de systèmes électroniques. C'est généralement considéré comme un défaut car source de panne ou de blocage.
Une situation de compétition peut survenir dès que plusieurs acteurs tentent d'accéder au même moment à une ressource partagée (fichier, imprimante, etc.) et qu'au moins l'un d'entre eux est susceptible de modifier son état. Cette définition implique que les systèmes dont les ressources partagées sont immuables (dont l'état ne peut pas changer) soient immunisés contre ce problème.
Les situations de compétition sont des problèmes particulièrement difficiles à identifier et à corriger puisqu'ils ne surviennent qu'à la suite de l'ordonnancement particulier et difficilement reproductible d'une séquence d'évènements.

## Logiciel multitâche

Une situation de compétition peut survenir dans un logiciel multitâche lorsque des données sont partagées sans précautions entre plusieurs tâches. Prenons l'exemple d'un système industriel qui comptabilise la production d'une machine. À chaque fois qu'une pièce est fabriquée, la routine ci-dessous est exécutée :
Cette routine incrémente le nombre total de pièces fabriquées. Mais si d'une manière ou d'une autre le logiciel est susceptible de réagir à la production concurrente de deux pièces, une situation de compétition survient. En effet, bien que sur une seule ligne de code, l'instruction qui modifie le nombre total de pièces n'est pas atomique et se décompose en instructions élémentaires de chargement, incrémentation et stockage :
Ainsi, quand deux pièces sont fabriquées à peu près simultanément, la séquence des instructions peut être la suivante :
| nouvelle pièce machine A | nouvelle pièce machine B |
| CHARGER accumulateur ← total_pièces | |
| INCRÉMENTER accumulateur | |
| | CHARGER accumulateur ← total_pièces |
| | INCRÉMENTER accumulateur |
| | STOCKER accumulateur → total_pièces |
| STOCKER accumulateur → total_pièces | |
En déroulant les instructions dans ces conditions — même en supposant les deux accumulateurs distincts — on se rend compte qu'à la fin, le nombre total de pièces a augmenté de un seulement alors que deux pièces ont été fabriquées. Ce problème ne survient que si les deux routines sont exécutées selon un timing très précis. On comprend donc dans ces conditions qu'un problème de situation de compétition peut rester caché longtemps avant de survenir.
Cette classe de défaut n'existe que dans les systèmes multitâches, mais il faut inclure dans cette définition les systèmes monotâches qui sont susceptibles de recevoir des stimuli extérieurs (« interruptions ») de façon imprévisible. Une situation de compétition peut avoir des effets néfastes pendant une longue période, et le système peut nécessiter d'être réinitialisé.
Pour éliminer les situations de compétition, il faut s'assurer que les opérations que l'on veut effectuer successivement soient atomiques ou autrement protégées par une exclusion mutuelle.

## Exclusion mutuelle

L'exclusion mutuelle est une méthode permettant d'éviter les situations de compétition et donc de s'assurer que lorsqu'une tâche tente d'accéder à une ressource partagée, les autres tâches seront bloquées en attente de la ressource.
Si l'on empêche les tâches d'accéder en même temps à la même ressource partagée, c’est-à-dire d'entrer dans leur section critique au même moment, les situations de compétition sont évitées.
Différents types d'exclusion mutuelle existent :
* la désactivation des interruptions ;
* les moniteurs ;
* les verrous ;
* les sémaphores ;
* les mutex (version simplifiée des sémaphores).

## Sécurité informatique

Dans un programme informatique qui aurait besoin d'une authentification avant d'effectuer une action, il s'écoule un laps de temps entre la réussite de l'authentification et l'action proprement dite. C'est dans ce laps de temps qu'une compétition peut se produire. Par exemple, un attaquant peut exploiter ce laps de temps pour détourner l'action prévue par le logiciel à ses propres fins.
La concurrence critique peut être utilisée pour prendre le contrôle d'un système au moment précis où une brèche éphémère est ouverte, c'est-à-dire au moment où il est vulnérable.