import threading
import time

NB_PASSAGES = 2

# Création des verrous sur les passages
..............................................

# 1 processus = 1 voie de passage
def passer(no_voie: int, nb_passages: int) -> None:
    """Simule le fonctionnement d'une voie du carrefour. On précise le numéro
       de la voie (ce qui permet de connaître le numéro des verrous à utiliser)
       et ne nombre de passage de véhicules à effectuer avant de sortir de la
       fonction."""
    while nb_passages > 0:
        # Détermine le numéro de la voiture de gauche
        ...........................
        # Avant de passer, il faut acquérir les verrous à gauche et de la voie
        ............................  # Bloque la voiture à gauche
        ............................. # ainsi que sa propre voie
        # Le passage est libre, on affiche que le véhicule passe
        print('Passage véhicule ' + str(no_voie))
        # Attente pour simuler le temps de passage du véhicule
        ...............
        # Libère les verrous utilisés
        .........................
        ..........................
        .................             # Puis décrémente le nombre de passages

# Création des fils d'exécution
fil_execution = [threading.Thread(target=passer,args=[i,NB_PASSAGES]) for i in range(4)]

# Démarrage des fils
for i in range(4):
    fil_execution[i].start()

# Attente de la fin de l'exécution des fils
for i in range(4):
    fil_execution[i].join()
    print("Fil " + str(i) + " fini.")

print("Fin du programme")