Multicœur et synchronisation

Lors d’une attente « jusqu’à ce que la file ne soit plus vide » avec une variable de condition, pourquoi revérifier la condition après le réveil avec une instruction while plutôt qu’avec une instruction if ?

  1. AParce que while s’exécute plus vite que if
  2. BParce que la règle interdit d’utiliser une variable de condition avec if
  3. CParce que même réveillé, la condition peut ne pas être remplie : un autre thread peut avoir pris l’élément avant, ou le réveil peut survenir sans raison
Afficher la réponse et l'explication

Réponse : C. Parce que même réveillé, la condition peut ne pas être remplie : un autre thread peut avoir pris l’élément avant, ou le réveil peut survenir sans raison

L’attente sur une variable de condition relâche le verrou et s’endort ; à la réception d’un signal, le thread se réveille, reprend le verrou et revient. Mais entre-temps, un autre thread peut avoir pris le verrou en premier et retiré l’élément de la file. De plus, les implémentations sont autorisées à réveiller un thread sans signal (réveil intempestif). On écrit donc une boucle while qui vérifie la condition après le réveil et attend de nouveau si elle n’est pas remplie.

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

Autres questions sur Multicœur et synchronisation

  1. Deux cœurs possèdent chacun dans leur cache une copie de la variable x. Après une écriture de x par le cœur 0, quel problème peut survenir lors de la lecture de x par le cœur 1 en l’absence de mécanisme de cohérence de cache ?
  2. Quelle combinaison correspond aux quatre états du protocole de cohérence de cache MESI ?
  3. Dans le protocole MESI, que signifie l’état Modified (M) d’une ligne de cache ?
  4. Dans le protocole MESI, que se passe-t-il lorsqu’un cœur écrit dans une ligne en état Exclusive (E) ?
  5. Dans un protocole de cohérence par invalidation, que se passe-t-il lorsqu’un cœur écrit dans une ligne en état Shared (S) ?

Comparatifs sur ce thème