Алгоритм Деккера (четвертый вариант).
VAR MAINPR: (1,2)
PR1WANT,PR2WANT:logical
PROCEDURE 1;
BEGIN
WHILE 1 DO
BEGIN
PR1WANT:='T';
WHILE PR2WANT DO
IF
(MAINPR=2)
BEGIN
PR1WANT:='F';
WHILE (MAINPRC=2) DO;
PR1WANT:='T';
END
критический участок
MAINPR:2
PR1WANT:='F';
остальные операнды
END
END
Пояснения: процесс 1 устанавливает флаг PR1WANT в истину (PR1WANT:='T')
- если у второго процесса флаг имеет значение F (false) то переходим к выполнению критического участка (WHILE PR2WANT DO)
- если второй процесс тоже хочет войти в КО, входим во внутренний цикл (IF (MAINPR=2)) :
- если избранный процесс – первый, пропускаем тело (IF (MAINPR=2)) и ждем, когда процесс 2 сбросит флаг
- если избранный процесс – второй, входим в тело (IF (MAINPR=2)), сбрасываем флаг первого процесса (PR1WANT:='F') и зацикливаемся пока процесс 2 не сбросит флаг (WHILE (MAINPR=2) DO), выполнив КО, т.е. сбрасывая флаг PR1WANT:='F' процесс 1 дает возможность второму процессу войти в КО.