Multicœur et synchronisation

Dans le code ci-dessus, le thread 1 prépare data puis le signale via flag, et le thread 2 lit data après avoir vu flag. Sur un CPU à modèle de cohérence faible, que faut-il pour que le thread 2 lise de façon certaine 42 ?

// スレッド1         // スレッド2
data = 42;           while (flag == 0) { }
flag = 1;            print(data);
  1. AChanger le type de data de int en long
  2. BGarantir l’ordre en faisant de l’écriture de flag une libération (release) et de sa lecture une acquisition (acquire)
  3. CNe rien écrire dans la boucle du thread 2
Afficher la réponse et l'explication

Réponse : B. Garantir l’ordre en faisant de l’écriture de flag une libération (release) et de sa lecture une acquisition (acquire)

Dans un modèle faible, les deux écritures du thread 1 peuvent être vues dans l’ordre inverse, ou la lecture de data par le thread 2 peut précéder celle de flag ; il peut donc arriver que flag vaille 1 alors que data est encore ancien. Faire de l’écriture de flag une libération garantit que les écritures antérieures sont vues avant, et faire de la lecture de flag une acquisition empêche les lectures postérieures de la devancer.

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

Autres questions sur Multicœur et synchronisation

  1. Quelle affirmation sur les opérations mémoire à sémantique d’acquisition (acquire) et de libération (release) est correcte ?
  2. En C, pourquoi ajouter seulement volatile à une variable drapeau échangée entre threads est-il insuffisant comme synchronisation ?
  3. Pourquoi _Atomic de C11 et std::atomic de C++11 permettent-ils de spécifier un ordre mémoire ?
  4. Quelle comparaison entre le « verrouillage à gros grain », qui protège toute une grande structure de données par un seul verrou, et le « verrouillage à grain fin », qui protège chaque partie par un verrou distinct, est correcte ?
  5. Quelle propriété caractérise un algorithme sans verrou (lock-free) ?

Comparatifs sur ce thème