12. Erreurs fréquentes et méthode de raisonnement
Erreurs fréquentes
- considérer
count++comme atomique; - protéger seulement une écriture alors que l’invariant couvre plusieurs opérations;
- utiliser
sleepcomme synchronisation temporelle; - tester un verrou puis le modifier séparément;
- dormir en conservant le mutex nécessaire au producteur de la condition;
- employer
ifautour depthread_cond_waitau lieu dewhile; - oublier que
signaln’est pas mémorisé par une variable de condition; - confondre sémaphore binaire et mutex propriétaire;
- détruire une primitive alors que des threads l’utilisent ou y attendent;
- supposer qu’une priorité élevée élimine l’inversion de priorité;
- croire qu’une barrière protège les données d’une phase;
- tester un appel système sur le noyau générique au lieu du noyau personnalisé.
Méthode d’analyse
Pour évaluer un algorithme concurrent :
- écrire l’état partagé et l’invariant attendu;
- décomposer chaque instruction de haut niveau en lectures et écritures possibles;
- placer une interruption après chaque étape critique;
- construire un entrelacement défavorable;
- vérifier exclusion, progression, attente bornée et indépendance temporelle;
- vérifier les chemins d’erreur, de destruction et de réveil;
- distinguer ce qui est garanti par la primitive de ce qui dépend de l’ordonnanceur.