Теория распараллеливания и синхронизация. Демьянович Ю.К - 58 стр.

UptoLike

а для процесса CS2
turn2 = 1; turn2 = turn1 + 1;
while (turn1! = 0 and turn2 >= turn1) skip;
В результате если процесс CS1 к моменту проверки в CS2 уже изме-
нил turn1 ак что turn1 положительно) и при этом присваивание
turn2 = turn1 + 1 вторым процессом оказалось позже упомянутого
изменения turn1, то второй процесс задержится на цикле while
до тех пор, пока первый процесс не пройдет свою критическую сек-
цию.
Замечание 1. Поскольку условия turn1 > turn2 и turn1
turn2 взаимно исключающие и дополняющие друг друга, то обя-
зательно произойдет нарушение лишь одного из них, и поэтому
точно один процесс войдет в свою критическую секцию.
Замечание 2. Протоколы входа двух процессов несимметрич-
ны. Для того, чтобы им придать симметричный вид введем отно-
шение сравнения двух чисел формулой
(a, b) > (c, d) == true (a > c) (a == c b > d),
(a, b) > (c, d) == false в остальных случаях.
Тогда условия turn1 > turn2 и turn1 turn2 могут быть пред-
ставлены в виде
turn1 > turn2 (turn1, 1) > (turn2, 2),
turn2 turn1 (turn2, 2) > (turn1, 1).
Обобщим теперь алгоритм поликлиники для двух процессов:
каждый из процессов показывает, что он собирается войти в свою
критическую секцию, присваивая переменной turn чи сл о 1. Затем
он найдет максимальное значение из все х turn[i] и прибавит к нему
1. Далее он запускает цикл for, и так же, как в крупномодульном
решении, ждет своей очереди.
АЛГОРИТМ ПОЛИКЛИНИКИ: МЕЛКОМОДУЛЬНОЕ
РЕШЕНИЕ
int turn[1 : n] = ([n]0); # инициализация
process CS[i = 1 to n] {
59