Какая инструкция дает атомность в этом выражении, что делает результат 2?

cs.stackexchange https://cs.stackexchange.com/questions/323

Вопрос

Я читаю об атомности и наткнулся на следующий сценарий

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top