Void main()

{

flag[0]=0;

flag[1]=0;

parbegin(P0,P1);

}

Для доказательства корректности задачи взаимного исключения необходимо проверить три положения.

1. Решение безопасно в том смысле, что два процесса не могут одновременно оказаться в своих критических интервалах

2. В случае сомнения, кому из двух процессов первому войти в критический интервал, выяснение этого вопроса не откладывается до бесконечности

3. Остановка какого-либо из процессов в остатке цикла не вызывает блокировки другого процесса.

Обобщенная задача взаимного исключения

Даны N процессов, каждый со своим критическим интервалом. Необходимо организовать их функционирование так, чтобы в любой момент самое большее один процесс находился в критическом интервале. Для проверки правильности решения проверяем три условия.

begin integer array b, c [0..N];

integer очередь;

for очередь = 0 step 1 until N do begin

b [очередь]:= 1;

c [очередь]:= 1;

end;

очередь:= 0;

Parbegin

процесс 1: begin … end;

процесс 2: begin … end;

процесс N: begin … end;

parend;

end;

процесс i: begin integer j, k;

Ai: b [i]:= 0;

Li: if (очередь ≠ i) then begin

c[i] = 1;

k = очередь;

if (b [k] = 1) then очередь:= i;

goto Li;

end;

c[i]:= 0;

for j:= 1 step 1 until N do

if ((j ≠ i) and (c[j] = 0)) then goto Li;

Критический интервал i;

очередь:= 0;

c[i]:= 1;

b[i]:= 1;

Oстаток цикла i;

goto Ai;

end;

Синхронизирующие примитивы (семафоры).


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



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