Une ligne qui paraît indivisible dans le code source ne l'est pas dans la machine. C'est de là que vient la classe de défauts la plus difficile à reproduire.
Ce que fait vraiment une incrémentation
compteur = compteur + 1
se décompose en trois étapes :
1. lire la valeur de compteur dans un registre
2. ajouter 1 au registre
3. écrire le registre dans compteur
L'entrelacement
Deux threads, A et B, incrémentent le même compteur, initialement à zéro. L'ordonnanceur leur donne la main dans cet ordre, une étape à chaque fois :
A A B B A B
Soit : A lit, A calcule, B lit, B calcule, A écrit, B écrit.
Objectif
Donner le nombre d'étapes d'une incrémentation, la valeur finale du compteur, la valeur attendue, et la valeur que B lit à sa première étape.
Pièges
Rien n'a planté, aucune exception n'a été levée, et le compteur est faux. C'est ce silence qui rend le défaut coûteux : il ne se manifeste que sous charge, et pas à chaque exécution.