Multicore und Synchronisation

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?

// スレッド1         // スレッド2
data = 42;           while (flag == 0) { }
flag = 1;            print(data);
  1. ADen Typ von data von int auf long ändern
  2. BDas Schreiben von flag als Release und das Lesen von flag als Acquire auszuführen, um die Reihenfolge zu garantieren
  3. CIn der Schleife von Thread 2 nichts hineinzuschreiben
Antwort und Erläuterung anzeigen

Antwort: B. Das Schreiben von flag als Release und das Lesen von flag als Acquire auszuführen, um die Reihenfolge zu garantieren

Bei schwachen Modellen können die beiden Schreibvorgänge von Thread 1 vertauscht erscheinen, oder das Lesen von data in Thread 2 kann vor dem Lesen von flag stattfinden, sodass flag bereits 1 ist, data aber noch veraltet. Macht man das Schreiben von flag zu einem Release, ist garantiert, dass die Schreibvorgänge davor zuerst sichtbar werden; macht man das Lesen von flag zu einem Acquire, werden die Lesevorgänge danach nicht vorgezogen.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Multicore und Synchronisation

  1. Was gilt für Speicheroperationen mit Acquire- und Release-Semantik?
  2. Warum genügt es in C nicht als Synchronisation, eine für den Austausch zwischen Threads verwendete Flag-Variable nur mit volatile zu versehen?
  3. Warum lässt sich bei _Atomic in C11 und std::atomic in C++11 die Speicherreihenfolge (Memory Order) angeben?
  4. Welche Aussage im Vergleich von „grobkörnigem Sperren“, bei dem eine gesamte große Datenstruktur mit einer Sperre geschützt wird, und „feinkörnigem Sperren“, bei dem Teile mit getrennten Sperren geschützt werden, ist richtig?
  5. Welche Eigenschaft sperrfreier (lock-free) Algorithmen ist richtig?

Vergleiche zu diesem Thema