Which instruction yields atomicity in this expression that makes the result 2?
-
16-10-2019 - |
Question
I am reading about atomicity and came across the following scenario
int x = y = z = 0;
Thread 1 Thread 2
--------- --------
x = y + z y = 1
z = 2
Which gives the following sets of output
$$\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}$$
Translating the $x=y+z$ expression to machine code gives
load r1; y
load r2; z
add r3; r1; r2
store r3;
However according to some notes I read going down the path of
T1 : load r1, y
T2 : y = 1
z = 2
T1 : load r2, z
add r3, r1, r
store r3, x
I cannot seem to understand how the author came to result that $x=2$.
To me, based on the previous machine instructions the result should be 3, which I guess leads me to realize I am supposed to hit eureka (or a simple misread) and realize where the atomicity occurs. Could you explain the atomicity in this fairly simple statement that leads to the correct result?
Solution
The point you are missing is that in thread $y$ is loaded into $r1$ and that any subsequent changes to $y$ will not affect the value stored in $r1$. Thus, the value in $r1$ is $0$ even after statement $y=1$. From this it is easy to see that the result is $x=2$.