Los cuales la instrucción produce la atomicidad en esta expresión que hace que el resultado 2?
-
16-10-2019 - |
Pregunta
Estoy leyendo sobre la atomicidad y me encontré con el siguiente escenario
int x = y = z = 0;
Thread 1 Thread 2
--------- --------
x = y + z y = 1
z = 2
Lo que da los siguientes conjuntos de salida
$$ \ begin {array} {ccc} 1 y 2 y 3 \\ T1: x = y + z y T2: y = 1 y T2: y = 1 \\ T2: y = 1 y T2: z = 2 & T1: x = y + z \\ T2: z = 2 & T1: x = y + z y T2: z = 2 \ end {array} $$
Traducción de la expresión $ x = y + z $ a código de máquina da
load r1; y
load r2; z
add r3; r1; r2
store r3;
Sin embargo, según algunas notas que leí va por el camino de la
T1 : load r1, y
T2 : y = 1
z = 2
T1 : load r2, z
add r3, r1, r
store r3, x
Me parece que no puede entender cómo el autor llegó a resultar que $ x = 2 $.
Para mí, basado en las instrucciones de la máquina anteriores, el resultado debe ser de 3, lo que supongo que me lleva a darse cuenta que debo golpe Eureka (o una mala lectura sencilla) y darse cuenta de que se produce la atomicidad . Podría explicar la atomicidad en este bastante simple declaración que lleva al resultado correcto?
Solución
El punto se echa en falta es que en hilo de $ y $ se carga en $ $ r1 y que cualquier cambio posterior a $ y $ no afectará el valor almacenado en $ $ r1. Por lo tanto, el valor de $ r1 $ es $ 0 $, incluso después de la declaración y = $ 1 $. A partir de esto, es fácil ver que el resultado es $ x = 2 $.