{
While (1)
{
while (flag[1]);
flag[0]=1;
критический интервал 1;
flag[0]=0;
….
}
}
Void P1()
{
While (1)
{
while (flag[0]);
flag[1]=1;
критический интервал 2;
flag[1]=0;
….
}
}
Void main()
{
flag[0]=0;
flag[1]=0;
parbegin(P0,P1);
}
Недостаток. При развитии процессов строго синхронно они могут одновременно войти в критический интервал.
Было предложено следующее решение (вариант 3)::
begin integer С1,С2;
С1:= 1;
С2:= 1;
Parbegin
Процесс 1: begin
А1: С1:= 0;
L1: if (С2 = 0) then goto L1;
критический интервал 1;
С1:= 1;
остаток цикла 1;
goto А1;
end;
Процесс 2: begin
А2: С2:= 0;
L2: if (С1 = 0) then goto L2;
критический интервал 2;
С2:= 1;
остаток цикла 2;
goto А2;
end;
parend;
end;
int flag[2];
Void P0()
{
While (1)
{
flag[0]=1;
while (flag[1]);
критический интервал 1;
flag[0]=0;
….
}
}
Void P1()
{
While (1)
{
flag[1]=1;
while (flag[0]);
критический интервал 2;
flag[1]=0;
….
}
}
Void main()
{
flag[0]=0;
flag[1]=0;
parbegin(P0,P1);
}
Недостаток. Бесконечно долго решается вопрос о том, кто первым войдет в критический интервал.
Решение 4.
begin integer С1,С2;
С1:= 1;
С2:= 1;
Parbegin
Процесс 1: begin
L1: С1:= 0;
if (С2 = 0) then begin C1:= 1; goto L1;
end;
критический интервал 1;
С1:= 1;
остаток цикла 1;
goto L1;
end;
Процесс 2: begin
L2: С2:= 0;
if (С1 = 0) then begin C2:= 1; goto L2;
end;
критический интервал 2;
С2:= 1;
остаток цикла 2;
goto L2;
end;
parend;
end;
int flag[2];
Void P0()
{
While (1)
{
flag[0]=1;
while (flag[1]);
{
flag[0]=0;
задержка;
flag[0]=1;
}
критический интервал 1;
flag[0]=0;
….
}
}
Void P1()
{
While (1)
{
flag[1]=1;
while (flag[0]);
{
flag[1]=0;
задержка;
flag[1]=1;
}
критический интервал 2;
flag[1]=0;
….
}
}
Void main()
{
flag[0]=0;
flag[1]=0;
parbegin(P0,P1);
}
Недостаток. Бесконечно долго решается вопрос о том, кто первым войдет в критический интервал.
Решение задачи взаимного исключения. Алгоритм Деккера.
begin integer С1,С2,очередь;
С1:= 1;
С2:= 1;
очередь:= 1;
Parbegin
Процесс 1: begin
А1: С1:= 0;
L1: if (С2 = 0) then begin
if (очередь = 1) then goto L1;
C1:= 1;
B1: if (очередь = 2) then goto B1;
goto А1;
end;
критический интервал 1;
очередь:= 2;
С1:= 1;
остаток цикла 1;
goto А1;
end;
Процесс 2: begin
А2: С2:= 0;
L2: if (С1 = 0) then begin
if (очередь = 2) then goto L2;
C2:= 1;
B2: if (очередь = 1) then goto B2;
goto А2;
end;
критический интервал 2;
очередь:= 1;
С2:= 1;
остаток цикла 2;
goto А2;
end;
parend;
end;
int flag[2], turn;
Void P0()
{
While (1)
{
flag[0]=1;
while (flag[1]);
{
if (turn==1)
{
flag[0]=0;
while (turn==1);
flag[0]=1;
}
}
критический интервал 1;
turn=1;
flag[0]=0;
….
}
}
Void P1()
{
While (1)
{
flag[1]=1;
while (flag[0]);
{
if (turn==0)
{
flag[1]=0;
while (turn==0);
flag[1]=1;
}
}
критический интервал 2;
turn=0;
flag[1]=0;
….
}
}
Void main()
{
flag[0]=0;
flag[1]=0;
turn=1;
parbegin(P0,P1);
}
Решение задачи взаимного исключения. Алгоритм Петерсона.
int flag[2], turn;
Void P0()
{
While (1)
{
flag[0]=1; turn=1;
while (flag[1] && (turn==1));
критический интервал 1;
flag[0]=0;
….
}
}
Void P1()
{
While (1)
{
flag[1]=1; turn=0;
while (flag[0] && (turn==0));
критический интервал 2;
flag[1]=0;
….
}
}