While (true) do

Begin

End.

Parend

Процесс_Y

В этом решении С1=1, когда ПРОЦЕСС_Х хочет войти в свой критический участок. С2=1, когда ПРОЦЕСС_Y хочет войти в свой критический участок, а переменная ОЧЕРЕДЬ указывает, чья очередь попытаться войти, при условии, когда оба процесса хотят выполнить свои критические участки.

Самостоятельно проверить этот алгоритм с различными относительными скоростями процессов.

Аппаратная реализация взаимоисключения: команда “проверка и установка” (testandset)

Алгоритм Деккера представляет собой программное решение проблемы взаимоисключения. Рассмотрим вариант аппаратного решения данной проблемы. Наличие аппаратной команды testandset, которая осуществляет чтение переменной; запись ее значения в область сохранения и установку конкретного значения этой переменной, причем выполняет эти действия до конца без прерывания, значительно упрощает решение проблемы критического участка посредством блокировки памяти.

Рассмотрим выполнение команды testandset с параметрами ОБЩИЙ и ЛОКАЛЬНЫЙ. Операция читает значение параметра ОБЩИЙ и присваивает его переменной ЛОКАЛЬНЫЙ, а затем устанавливает в переменной ОБЩИЙ значение 1.

Переменная ОБЩИЙ разделяется между процессами, которые подлежат синхронизации по отношению к некоторому критическому ресурсу. У каждого процесса есть своя собственная переменная ЛОКАЛЬНЫЙ_Х и ЛОКАЛЬНЫЙ_Y.

Рассмотрим решение проблемы взаимоисключения с помощью операции testandset.

var ОБЩИЙ: integer;

procedure Процесс_Х;

var ЛОКАЛЬНЫЙ_Х: integer;