Cześć,
Czy poniższy kod jest poprawny?
Problem pięciu filozofów, wersja pierwsza.
const
N = 5;
var
widelec: array [0..N-1] of buffer;
m: integer; { wartość nieistotna }
process Filozof (i: 0..N-1);
var
m: integer;
begin
repeat
myśli;
GetMessage (widelec[i], m); { podniesienie widelca po lewej stronie }
GetMessage (widelec[(i+1) mod N], m); { podniesienie widelca po prawej stronie }
je;
GetMessage (widelec[i], m); { odłożenie widelca po lewej stronie }
GetMessage (widelec[(i+1) mod N], m); { odłożenie widelca po prawej stronie }
until false;
end
Wydaje mi się, że zamiast dwóch ostatnich GetMessage winno być SendMessage.
Niżej jest co najmniej jeden błąd.
Problem pięciu filozofów, wersja druga.
proces Widelec;
var
kto_je, k1, k2: integer;
begin
kto_je := 0; k2 := 0; { inicjacja na dowolne wartości, ale tak aby kto_je = k1 }
repeat
GetMessage (w[i], k1);
if k2 = kto_je then { przy pierwszym obrocie prawda }
kto_je := k1 { zamówienie było od k1 }
else
kto_je := k2; { zamówienie było od k2 }
SendMessage (f[kto_je], i); { potwierdzenie o dowolnej treści }
GetMessage (w[i], k2); { czekamy na komunikat }
until false
end;
Łatwo widać, że inicjacja nie jest tak, by kto_je=k1, tylko kto_je=k2.
W jaki sposób powinien wyglądać powyższy algorytm?
Niezależnie od tego, nie rozumiem, jaki jest sens umieszczonej w kodzie instrukcji "if k2 = kto_je then kto je := k1 (...)", skoro za pierwszym razem musi ona zmienić wartość kto_je.
Po drugie, skąd wiadomo, że to k2 będzie trzymało tą wartość, którą chcemy sprawdzić? Tzn.: o ile rozumiem, nie mamy jakichkolwiek gwarancji dotyczących tego, w jakiej kolejności dojdą komunikaty. Załóżmy np., że filozofem, który je jest filozof 2. kto_je i k2 są początkowo ustawione na zero. W jaki sposób kto_je jest inicjowane na rzeczywistą wartość (czyli tutaj 2) jest również dla mnie niezrozumiałe. Załóżmy jednak, że kto_je jest już ustawione na wartość 2. Nadchodzi komunikat, od filozofa 2, który jest umieszczany w k1. Ale ze względu na to, że k1 nie jest nigdy sprawdzane, więc nigdy nie dojdzie do zwolnienia widelca! To nie jest zjawisko zakleszczenia, o którym mowa, to jest inny, dodatkowy błąd w powyższym kodzie.
Z góry dzięki za odpowiedzi,
Pozdrawiam.