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;
  1. Ar1 = 1 und r2 = 1
  2. Br1 = 0 und r2 = 1
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Multicore und Synchronisation

  1. Welches Merkmal des Speicherkonsistenzmodells von x86 (TSO, Total Store Order) ist richtig?
  2. Was gilt für schwache Speicherkonsistenzmodelle wie bei ARM oder RISC-V (RVWMO)?
  3. Welche Aufgabe haben Memory-Barrier-(Fence-)Befehle?
  4. Im obigen Code bereitet Thread 1 data vor und signalisiert dies mit flag; Thread 2 liest data, nachdem er flag gesehen hat. Was ist nötig, damit Thread 2 auf einer CPU mit schwachem Speicherkonsistenzmodell sicher 42 liest?
  5. Was gilt für Speicheroperationen mit Acquire- und Release-Semantik?

Vergleiche zu diesem Thema