Pour éviter les interblocages, il est nécessaire de contrôler la direction des trains en circulation et leur nombre dans chaque section. Nous ajoutons deux nouvelles variables : `trainsWaitingRL` et `trainsWaitingLR`, qui comptent les trains en attente par direction. Ces variables permettront de donner la priorité aux trains qui attendent depuis plus longtemps et ainsi d’éviter les situations de famine où un train pourrait être bloqué indéfiniment.
### Question 3.2
L’invariant de sûreté doit garantir qu’un train ne quitte pas une gare si des trains du sens inverse sont déjà en mouvement. Pour cela, un train ne pourra avancer que si aucun train ne se déplace dans le sens opposé. La nouvelle condition qui doit être respectée peut être formulée ainsi :
(currentDirection == d) || (movingTrains == 0)
### Question 3.3
La gestion des interblocages repose principalement sur la classe Railway, qui contrôle la direction des trains, le nombre de trains en déplacement et les trains en attente. C’est dans cette classe que les décisions de départ des trains doivent être prises en fonction de l’état du système. Railway sera donc responsable de la mise en œuvre de la synchronisation et du respect de l’invariant de sûreté.