Rozwiązanie problemu pięciu filozofów oparte
o porządek zasobów (”numerację” widelców, zob. slajdy nr 8 na
Pegazie). Rozwiązanie powinno wykorzystywać semafory zrealizowane
jako obiekty typu chronionego (typ SemBin w pliku źródłowym).
Zmodyfikować rozwiązanie aby działało poprawnie, gdy w uczcie bierze
udział ustalona liczba N > 2 filozofów.
with Ada.Text_IO;
use Ada.Text_IO;
procedure Filozofowie is
----- typ reprezentujacy semafor binarny -----
protected type SemBin(W: Boolean := True) is -- domyslna wartosc poczatkowa: True (podniesiony)
-- tutaj definicje procedur/entry/funkcji
entry P;
procedure V;
function moznaP return Boolean;
private
-- tutaj definicje danych (pol prywatnych)
Wartosc: Boolean := W;
end SemBin;
protected body SemBin is
entry P when Wartosc is -- kod bedzie wykonany tylko jesli Wartosc=True
begin
Wartosc:= False;
end P;
procedure V is
begin
Wartosc:= True;
end V;
function moznaP return Boolean is -- zwraca Wartosc tzn. "czy mozna wykonac P"
begin
return Wartosc;
end moznaP;
end SemBin;
----- koniec semafora -----
-- tablica semaforow
Widelec: array(0..4) of SemBin;
----- zadania filozofow - uzupelnic wedlug warunkow zadania -----
task type Filozof(id: Integer) is
end Filozof;
task body Filozof is
procedure myslenie is
begin
delay 2.0;
end myslenie;
procedure jedzenie is
begin
delay 2.0;
end jedzenie;
procedure podnies_widelce is
begin
null; --<-- TU KOD -----
end;
procedure odloz_widelce is
begin
null; --<-- TU KOD -----
end;
begin
loop
Put_Line("Filozof nr" & Integer'Image(id) & " mysli...");
myslenie;
podnies_widelce;
Put_Line("Filozof nr" & Integer'Image(id) & " zaczyna jesc...");
jedzenie;
Put_Line("Filozof nr" & Integer'Image(id) & " konczy jedzenie...");
odloz_widelce;
end loop;
end Filozof;
----- koniec filozofow -----
----- utworzenie zadan filozofow
F0: Filozof(0);
F1: Filozof(1);
F2: Filozof(2);
F3: Filozof(3);
F4: Filozof(4);
begin
null; -- instrukcja pusta
end Filozofowie;