Multicœur et synchronisation

Quel est le fonctionnement de l’instruction atomique CAS (compare-and-swap) ?

  1. AElle n’écrit la nouvelle valeur que si la valeur en mémoire est égale à la valeur attendue, et indique si elle a réussi
  2. BElle compare deux valeurs en mémoire et écrit la plus grande dans les deux
  3. CElle échange sans condition la valeur en mémoire et la valeur du registre
Afficher la réponse et l'explication

Réponse : A. Elle n’écrit la nouvelle valeur que si la valeur en mémoire est égale à la valeur attendue, et indique si elle a réussi

CAS effectue de façon indivisible l’opération « si la valeur à cette adresse est toujours la valeur attendue, la remplacer par la nouvelle valeur ». Si un autre thread a modifié la valeur entre la lecture et l’écriture, l’opération échoue ; on peut donc mettre à jour en vérifiant que la valeur n’a pas changé. Avec une boucle qui, en cas d’échec, relit, recalcule et retente le CAS, on met à jour une valeur partagée en toute sécurité sans verrou. L’instruction cmpxchg de x86 en est un exemple.

S'entraîner sur ce thème Retour au thème

Autres questions sur Multicœur et synchronisation

  1. 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 ?
  2. Avec une paire d’instructions comme LR/SC (load-reserved/store-conditional) de RISC-V, dans quel cas le SC (store-conditional) échoue-t-il ?
  3. Quelle description du problème ABA, qui affecte les structures de données sans verrou utilisant CAS, est correcte ?
  4. Quel est le fonctionnement d’une instruction fetch-and-add, comme amoadd.w de RISC-V ou lock xadd de x86 ?
  5. Quelle description du verrou à attente active (spinlock) est correcte ?

Comparatifs sur ce thème