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?

¿Fue útil?

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 $.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a cs.stackexchange
scroll top