Возможное значение переменной, если два потока работают параллельно? - PullRequest
2 голосов
/ 27 февраля 2020

Проблема из справочного документа по адресу Стэнфорд. Это описание выглядит следующим образом:

Предположим, что два потока одновременно выполняют следующий код 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 возможен в это дело?

1 Ответ

5 голосов
/ 27 февраля 2020

Вы можете получить -3 следующим образом:

  1. В потоке 1 отметьте a < 0, что неверно. Это приведет вас к другому состоянию. Прочитайте значение b, которое равно 0.
  2. Переключитесь на поток 2, выполните его полностью. a теперь -3.
  3. Переключитесь обратно на поток 1, прочитайте a, то есть -3. Затем добавьте и присвойте -3 c.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...