{
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;
Синхронизирующие примитивы (семафоры).