Multicœur et synchronisation
Le code ci-dessus double la variable partagée counter au moyen de CAS(&p, valeur attendue, nouvelle valeur). Dans quel cas le CAS échoue-t-il et la boucle recommence-t-elle ?
int old, new;
do {
old = counter;
new = old * 2;
} while (!CAS(&counter, old, new));
- ALorsque counter vaut 0
- BLorsqu’un autre thread a modifié counter entre la lecture de old et l’exécution du CAS
- CLorsque new est supérieur à old
Afficher la réponse et l'explication
Réponse : B. Lorsqu’un autre thread a modifié counter entre la lecture de old et l’exécution du CAS
CAS écrit la nouvelle valeur si counter vaut toujours old, la valeur lue. Si un autre thread a modifié la valeur entre-temps, la valeur new locale a été calculée à partir d’une valeur obsolète : CAS n’écrit pas et renvoie un échec. La boucle relit la valeur la plus récente et refait le calcul. Pour une simple addition, fetch-and-add suffit, mais cette forme permet d’effectuer de façon indivisible toute mise à jour arbitraire, comme un doublement.
Continuer : 9 autres questions sur Multicœur et synchronisation