Void P0()

{

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;

….

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: