Проблема из справочного документа по адресу Стэнфорд. Это описание выглядит следующим образом:
Предположим, что два потока одновременно выполняют следующий код C, обращаясь к общим переменным a, b и c:
Инициализация
int a = 4;
int b = 0;
int c = 0;
Резьба 1:
if (a < 0) {
c = b - a;
} else {
c = b + a;
}
Тема 2:
b = 10;
a = -3
Каковы возможные значения для c
после завершения обоих потоков? Можно предположить, что чтение и запись переменных являются атомами c, и что порядок операторов в каждом потоке сохраняется в коде, сгенерированном компилятором C.
Ответ: 4 , 7,14,13, -3
Первые четыре вывода я понял следующим образом, но я не могу понять, как вывод -3 может происходить при таком порядке операторов в потоке
4 : полностью выполнить поток 1, затем выполнить поток 2.
7 : прервать поток 1 до c = b + a
, а затем выполнить поток 2, с последующим выполнением потока 1 снова.
14 : выполнить поток 2 до завершения b = 10
, затем прервать его и выполнить поток 1 полностью.
13 : полностью выполнить поток 2, затем поток 1.
Теперь я застрял в том, как получить -3 в качестве окончательного значения c
? -3 возможна только тогда, когда b=0
и a=-3
, а поток 1 начинает свое выполнение с c = b + a
. Я не вижу возможности -3 в любом другом случае. Но, как упоминалось в вопросе, порядок утверждений сохраняется, поэтому значение a не может быть -3, если мы не изменим значение b на 10.
Может кто-нибудь объяснить, как вывод -3 возможен в это дело?