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);
- ADen Typ von data von int auf long ändern
- BDas Schreiben von flag als Release und das Lesen von flag als Acquire auszuführen, um die Reihenfolge zu garantieren
- 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.