Multicore und Synchronisation
Die beiden obigen Threads laufen gleichzeitig auf getrennten Kernen (ohne Umordnung durch den Compiler). Welches Ergebnis tritt bei sequentieller Konsistenz nicht auf, kann aber bei realen CPUs wie x86 auftreten?
// 最初は x = 0, y = 0
// スレッド1 // スレッド2
x = 1; y = 1;
r1 = y; r2 = x;
- Ar1 = 1 und r2 = 1
- Br1 = 0 und r2 = 1
- Cr1 = 0 und r2 = 0
Antwort und Erläuterung anzeigen
Antwort: C. r1 = 0 und r2 = 0
Bei sequentieller Konsistenz wird eines der Schreibvorgänge zuerst ausgeführt, sodass mindestens einer der Lesevorgänge 1 sehen müsste. Bei realen CPUs gelangt x = 1 jedoch zunächst in den Store-Buffer des Kerns, und das folgende Lesen r1 = y kann seinen Wert aus Hauptspeicher oder Cache vorher lesen, bevor das Schreiben für andere Kerne sichtbar ist. Geschieht dies auf beiden Kernen, lesen beide 0. Verhindert wird dies durch eine Memory Barrier zwischen Schreiben und Lesen.