Какая инструкция дает атомность в этом выражении, что делает результат 2?
-
16-10-2019 - |
Вопрос
Я читаю об атомности и наткнулся на следующий сценарий
int x = y = z = 0;
Thread 1 Thread 2
--------- --------
x = y + z y = 1
z = 2
Который дает следующие наборы вывода
$$ 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 {массив} $$
Перевод выражения $ x = y+z $ на машинный код дает
load r1; y
load r2; z
add r3; r1; r2
store r3;
Однако, согласно некоторым заметкам, которые я прочитал
T1 : load r1, y
T2 : y = 1
z = 2
T1 : load r2, z
add r3, r1, r
store r3, x
Кажется, я не могу понять, как автор пришел в результате, что $ x = 2 $.
Для меня, основываясь на предыдущих инструкциях по машине, результат должен быть 3, что, я думаю, заставляет меня понять, что я должен ударить Эврика (или простое неправильное прочтение) и понимайте, где происходит атомичность. Не могли бы вы объяснить атомичность в этом довольно простом утверждении, которое приводит к правильному результату?
Решение
То, что вам не хватает, заключается в том, что в потоке $ y $ загружен в $ 1 $ и что любые последующие изменения в $ y $ не повлияют на стоимость, хранящуюся в $ 1 $. Таким образом, стоимость в $ R1 $ составляет $ 0 $ даже после выписки $ y = 1 $. Из этого легко увидеть, что результат - $ x = 2 $.