Поток и синхронизация - PullRequest
       6

Поток и синхронизация

2 голосов
/ 10 февраля 2012

Я не совсем понимаю, как работают потоки и синхронизация. Я работаю над примером проблемы, которая описывается так:

Существует два потока: P и Q. Переменная counter является общей для обоих потоков. Модификация счетчика в одном потоке видна другому потоку. инструкция приращения добавляет единицу к переменной, сохраняя новое значение.

1   global integer counter = 0
2
3   thread P()
4       incr(counter)
5       print counter
6   end
7
8   thread Q()
9       print counter
10      incr(counter)
11      print counter
12      incr(counter)
13  end

Существует три оператора печати, которые выводят значение счетчика. В выходной В приведенном ниже списке укажите, возможен ли данный вывод, и если да, укажите инструкции перемежения (с использованием номеров потоков и строк) P и Q, которые может привести к выходу.

В примере есть вывод 122 возможно ли? который может быть произведен P4, Q9, Q10, P5, Q11, Q12. Я не могу обернуть голову, как это работает.

1 Ответ

4 голосов
/ 10 февраля 2012

Предположим, что поток P запускается первым и увеличивает "счетчик" на единицу. Затем он приостанавливается и запускается поток Q, читает «counter» и печатает его значение («1»). Следующий поток Q увеличивает значение "counter", которое теперь равно "2". Затем поток Q приостанавливается, а поток P продолжается. Теперь он читает «counter» и печатает его значение («2»). Поток P заканчивается. Поток Q продолжается, читает и печатает «counter» («2»). Затем значение счетчика увеличивается на единицу.

Поэтому вывод: "122"

Это одна из возможных последовательностей исполнения. Вообще говоря, вы никогда не сможете определить, когда поток приостановлен и когда он продолжается, в этом весь смысл этого упражнения. Добавив механизмы синхронизации (которых в этом примере совершенно не хватает), вы можете снова получить контроль над последовательностью выполнения.

...