While (true) do
Begin
End.
Parend
Процесс_Y
В этом решении С1=1, когда ПРОЦЕСС_Х хочет войти в свой критический участок. С2=1, когда ПРОЦЕСС_Y хочет войти в свой критический участок, а переменная ОЧЕРЕДЬ указывает, чья очередь попытаться войти, при условии, когда оба процесса хотят выполнить свои критические участки.
Самостоятельно проверить этот алгоритм с различными относительными скоростями процессов.
Аппаратная реализация взаимоисключения: команда “проверка и установка” (testandset)
Алгоритм Деккера представляет собой программное решение проблемы взаимоисключения. Рассмотрим вариант аппаратного решения данной проблемы. Наличие аппаратной команды testandset, которая осуществляет чтение переменной; запись ее значения в область сохранения и установку конкретного значения этой переменной, причем выполняет эти действия до конца без прерывания, значительно упрощает решение проблемы критического участка посредством блокировки памяти.
Рассмотрим выполнение команды testandset с параметрами ОБЩИЙ и ЛОКАЛЬНЫЙ. Операция читает значение параметра ОБЩИЙ и присваивает его переменной ЛОКАЛЬНЫЙ, а затем устанавливает в переменной ОБЩИЙ значение 1.
Переменная ОБЩИЙ разделяется между процессами, которые подлежат синхронизации по отношению к некоторому критическому ресурсу. У каждого процесса есть своя собственная переменная ЛОКАЛЬНЫЙ_Х и ЛОКАЛЬНЫЙ_Y.
Рассмотрим решение проблемы взаимоисключения с помощью операции testandset.
var ОБЩИЙ: integer;
procedure Процесс_Х;
var ЛОКАЛЬНЫЙ_Х: integer;