![](/user_photo/2706_HbeT2.jpg)
Решение:
Init: proc (var S: integer; value: integer); begin S:=value end;
PP: procedure (var S: integer);
common binary semaphore B1, B2;
Begin P(B1); S:=S–1; if S<0 then begin V(B1); P(B2) end
Else V(B1) end;
VP: procedure (var S: integer);
common binary semaphore B1, B2;
Begin P(B1); S:=S+1; if S<=0 then V(B2); V(B1 ) end;
//нет инициализации семафоров. Нужно изменить Init до:
Init: proc (var S: integer; value: integer);
common binary semaphore B1, B2;
begin B1:=1; B2:=0; S:=value end;
Решение:
Init: proc (var S: integer; value: integer);
common binary semaphore B1, B2;
begin B1:=1; B2:=0; S:=value end;
PP: procedure (var S: integer);
common binary semaphore B1, B2;
Begin P(B1); S:=S–1; P(B2) end;
VP: procedure (var S: integer);
common binary semaphore B1, B2;
Begin P(B2); S:=S+1; V(B1 ) end;
//нету V(B2)
+ нет связи с переменной S.
Можно исправить до «а» с исправленной Init
Решение:
Init: proc (var S: integer; value: integer); common binary semaphore B;
begin B:=1; S:=value end;
PP: procedure (var S: integer);
common binary semaphore B;
Begin if S>0 then begin P(B); S:=S–1; V(B) end end;
VP: procedure (var S: integer);
common binary semaphore B;
Begin P(B); S:=S+1; V(B) end;
//если S<=0 то PP ничего не делает
Решение:
Init: proc (var S: integer; value: integer); begin S:=value end;
PP: procedure (var S: …); common binary semaphore B1, B2;
Begin P(B1); S:=S–1; if S<0 then P(B2) Else V(B1) end;
VP: procedure (var S: …); common binary semaphore B1, B2;
Begin P(B1); S:=S+1; if S<=0 then V(B2); V(B1 ) end;
Нет инициализации семафоров. Если переписать процедуру Init до:
Init: proc (var S: integer; value: integer);
common binary semaphore B1, B2;
begin B1:=1; B2:=1; S:=value end;
Если в какой то момент времени S стало равно 0, а B2=1, то, проходя процедуру PP, мы проходим «P(B2)» и B2 стало =0. В итоге прошли PP насквозь, ресурса как не было, так и нет, а должны были встать на ожидание.
Решение:
Init: proc (var S: integer; value: integer);
common binary semaphore B1, B2;
begin B1:=1; B2:=1; S:=value end;
PP: procedure (var S: integer);
common binary semaphore B1, B2;
Begin P(B1); S:=S–1; if S<0 then P(B2) Else V(B1) end;
VP: procedure (var S: integer);
common binary semaphore B1, B2;
Begin P(B1); S:=S+1; if S>0 then V(B2); V(B1 ) end;
Если S=0, аналогично «d» в РР проходим все и выходим, не встав на ожидание.
Задача “обедающие философы” формулируется следующим образом: “Пять философов садятся обедать за круглый стол, в центре которого стоит одно блюдо со спагетти. На столе имеется пять тарелок и пять вилок между ними. Философ может начать есть, если у него есть тарелка и две вилки, которые он может взять с двух сторон от своей тарелки. Философ может отдать одну вилку ближайшему соседу только после того, как он положит в свою тарелку спагетти, а вторую – после того, как закончит обед”. О соображениях гигиены мы здесь умалчиваем. Может ли описанный ниже на псевдокоде процесс представить алгоритм поведения философа за столом?