Frage

Ich lese über Atomizität und stieß auf das folgende Szenario

int x = y = z = 0;

Thread 1        Thread 2
---------       --------
x = y + z       y = 1
                z = 2

Das gibt die folgenden Ausgangssätze

$$ begin {array} {ccc} 1 & 2 & 3 t1: x = y + z & t2: y = 1 & t2: y = 1 t2: y = 1 & t2: z = 2 & t1: x = y + z t2: z = 2 & t1: x = y + z & t2: z = 2 end {Array} $$

Übersetzung des Ausdrucks von $ x = y+z $ in den Maschinencode ergibt

load r1; y
load r2; z
add r3; r1; r2
store r3; 

Nach einigen Notizen habe ich jedoch gelesen, wie ich den Weg von von

T1 : load r1, y
T2 : y = 1
     z = 2
T1 : load r2, z
     add r3, r1, r         
     store r3, x

Ich kann nicht verstehen, wie der Autor dazu gekommen ist, dass $ x = 2 $.

Für mich sollte das Ergebnis 3 sein, was auf den vorherigen Maschinenanweisungen 3 sein sollte, was mich vermute, zu erkennen, dass ich schlagen soll Eureka (oder ein einfaches falsches Lesen) und erkennen, wo die Atomizität auftritt. Könnten Sie die Atomizität in dieser ziemlich einfachen Aussage erklären, die zum richtigen Ergebnis führt?

War es hilfreich?

Lösung

Der Punkt, den Sie fehlen, ist, dass $ y $ in Thread in $ R1 $ geladen wird und dass nachfolgende Änderungen an $ y $ den in $ R1 $ gespeicherten Wert nicht beeinflussen. Daher beträgt der Wert in $ R1 $ 0 $, selbst nach Erklärung $ y = 1 $. Daraus ist leicht zu erkennen, dass das Ergebnis $ x = 2 $ ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top