label 1. 2;
var перекл1. перекл2: boolean;
ОЧЕРЕДЬ : integer:
Begin перекл 1 :=faIse: перекп2:=false; ОЧЕРЕДЬ:=1: parbegin
while true do
begin перекл1:true: продолжение
220________ Глава 7. Организация параллельных взаимодействующих вычислений
Листинг 7.4 (продолжение)
1: if перекл2=true then
if 0ЧЕРЕДЬ=1 then go to 1 else begin перекл1:=false; while 0ЧЕРЕДЬ=2 do begin end end else begin
CS1 { критическая секция ПР1 } ОЧЕРЕДЬ: =2: перекл1:=false end end and while true do
begin перекл2:=1; 2: if перекл=true then
if 0ЧЕРЕДЬ=2 then go to 2 else begin перекл2:=false; while 0ЧЕРЕДЬ=1 do begin end end else begin
CS2 { критическая секция ПР2 } 0ЧЕРЕДЬ:=1; перекл2:=false end end
parend end.
Если перекл2 = true и перекл1 = false, то выполняется критическая секция процесса ПР2 независимо от значения переменной ОЧЕРЕДЬ. Аналогично для случая пе-рекл2 = false и перекл1 = true.
Если же оба процесса хотят выполнить свои критические секции, то есть перекл2 = = true и перекл1 = true, то выполняется критическая секция того процесса, на который указывает значение переменной ОЧЕРЕДЬ, независимо от скоростей развития обоих процессов. Использование переменной ОЧЕРЕДЬ совместно с переменными перекл1 и перекл2 в алгоритме Деккера позволяет гарантированно решать проблему критических секций. То есть переменные перекл1 и перекл2 гарантируют, что взаимное выполнение не может иметь места; переменная ОЧЕРЕДЬ гарантирует, что не может быть взаимной блокировки, так как переменная ОЧЕРЕДЬ не меняет своего значения во время выполнения программы принятия решения о том, кому же сейчас проходить свою критическую секцию.
Тем не менее реализаций критических секций на основе описанного алгоритма практически не встречается из-за их чрезмерной сложности, особенно тогда, когда требуется обобщить алгоритм Деккера с двух до N процессов.