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;
- Ar1 = 1 et r2 = 1
- Br1 = 0 et r2 = 1
- 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.
Continuer : 9 autres questions sur Multicœur et synchronisation