đź”’ Verrouillage
🎯 Objectif pédagogique​
- Identifier et reproduire différents types de conditions de course.
- Comprendre l'impact des conditions de course sur l'intégrité des données.
- Analyser les résultats imprévisibles causés par la concurrence.
📜 Énoncé​
Partie 1 : Compte bancaire défaillant​
Créez une classe CompteBancaire
avec les méthodes suivantes en ajoutant des
time.sleep()
pour simuler des opérations lentes. N'utilisez pas encore de
synchronisation.
class CompteBancaire:
def __init__(self, solde_initial=1000):
self.solde = solde_initial
def deposer(self, montant):
# Simulation d'une opération qui prend du temps
# (vérifications, communications avec la banque, etc.)
pass
def retirer(self, montant):
# Vérifier si le solde est suffisant
# Effectuer le retrait si possible
pass
def get_solde(self):
return self.solde
Partie 2 : Simulation de transactions concurrentes​
Créez une fonction de test qui :
- Crée un compte avec 1000$
- Lance 5 threads qui font chacun 10 dépôts de 50$
- Lance 3 threads qui font chacun 5 retraits de 100$
- Affiche le solde final et l'historique
Partie 3 : Analyse des problèmes​
Exécutez vos tests plusieurs fois et documentez :
- Problèmes observés :
- Le solde final correspond-il au calcul attendu ?
- Que se passe-t-il si on autorise les soldes négatifs ?
- Peut-on retirer plus d'argent que disponible ?
Partie 4 : Synchronisation​
Ajoutez des mécanismes de synchronisation (comme des Lock
) pour protéger les
opérations critiques dans la classe CompteBancaire
. Réexécutez les tests et
comparez les résultats.