Multicœur et synchronisation

Les deux threads ci-dessus s’exécutent simultanément sur des cœurs différents (sans réordonnancement par le compilateur). Quel résultat est impossible en cohérence séquentielle mais possible sur un CPU réel comme x86 ?

// 最初は x = 0, y = 0
// スレッド1      // スレッド2
x = 1;            y = 1;
r1 = y;           r2 = x;
  1. Ar1 = 1 et r2 = 1
  2. Br1 = 0 et r2 = 1
  3. Cr1 = 0 et r2 = 0
Afficher la réponse et l'explication

Réponse : C. r1 = 0 et r2 = 0

En cohérence séquentielle, l’une des écritures a lieu en premier, donc au moins une des lectures doit voir 1. Mais sur un CPU réel, x = 1 entre d’abord dans le tampon d’écriture du cœur, et la lecture suivante r1 = y peut obtenir sa valeur de la mémoire principale ou du cache avant que l’écriture ne soit visible des autres cœurs. Si cela se produit sur les deux cœurs, tous deux lisent 0. Pour l’éviter, on insère une barrière mémoire entre l’écriture et la lecture.

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

Autres questions sur Multicœur et synchronisation

  1. Quelle est la caractéristique du modèle de cohérence mémoire de x86 (TSO, Total Store Order) ?
  2. Quelle affirmation sur les modèles de cohérence mémoire faibles comme ceux d’ARM ou de RISC-V (RVWMO) est correcte ?
  3. Quel est le rôle d’une instruction de barrière mémoire (fence) ?
  4. 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 ?
  5. Quelle affirmation sur les opérations mémoire à sémantique d’acquisition (acquire) et de libération (release) est correcte ?

Comparatifs sur ce thème