Nie wiem jak uzupełnić monitor Lodka tak żeby zwierzęta były przewożone niepojedynczo biorąc pod uwagę że na łódce może być tylko jeden typ zwierzęcia.
Wątki zwierzaków pojawiają się w losowej kolejności; każdy z nich przed wejściem do łódki wywołuje entry chceWsiasc z parametrem określającym jego własny typ a następnie
wejdz. Do ”symulacji” płynięcia łódki służy procedura lodkaPlynie.
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Fixed;
procedure Zwierzaki is
----- zamek dla ochrony wypisywania -----
task Mutex is -- taka definicja utworzy obiekt Mutex
entry lock;
entry unlock;
end Mutex;
task body Mutex is
begin
loop
accept lock;
accept unlock;
end loop;
end Mutex;
----- koniec zamka -----
----- symulacja plyniecia lodki -----
procedure lodkaPlynie(ile: Integer) is
begin
Mutex.lock;
Put("Lodka plynie - liczba zabranych zwierzakow" & Integer'Image(ile) & "...");
delay 2.0;
Put_Line(" Lodka wraca...");
delay 0.5;
Mutex.unlock;
end lodkaPlynie;
----- koniec symulacji plyniecia -----
----- typ reprezentujacy rodzaje zwierzakow
type TypZwierza is (Pies,Kot,Stwor,Inny);
-- funkcja pomocnicza zamieniajaca typ na napis
function typ2string(t: TypZwierza) return String is
begin
case t is
when Pies => return "Pies";
when Kot => return "Kot";
when others => return "Nieznany";
end case;
end typ2string;
----- watek monitora -----
task Lodka is -- utworzy obiekt
entry chceWsiasc(typ: TypZwierza);
entry Wejdz;
end Lodka;
task body Lodka is
begin
end Lodka;
----- koniec monitora -----
----- typ i kod watku zwierzaka -----
task type Zwierzak is -- definicja typu (nie tworzy obiektu)
entry Init(t: TypZwierza; n: String);
end Zwierzak;
task body Zwierzak is
typ: TypZwierza;
nazwa: String(1..10); -- uwaga: nazwy zwierzakow nie moga byc dluzsze niz 10 znakow
begin
accept Init(t: TypZwierza; n: String) do
typ:= t;
Ada.Strings.Fixed.Move(n, nazwa); -- kopiowanie napisu (z ewentualnym uzupelnieniem spacjami)
end;
loop
Mutex.lock;
Put_Line("Zwierzak " & Ada.Strings.Fixed.Trim(nazwa, Ada.Strings.Right) & " typu " & typ2string(typ) & " chce wsiasc.");
delay 0.5;
Mutex.unlock;
Lodka.ChceWsiasc(typ);
Lodka.Wejdz;
Mutex.lock;
Put_Line("Zwierzak " & Ada.Strings.Fixed.Trim(nazwa, Ada.Strings.Right) & " typu " & typ2string(typ) & " jest na lodce.");
delay 0.5;
Mutex.unlock;
end loop;
end Zwierzak;
----- koniec zwierzaka -----
-- Inicjalizacja - tworzenie tablicy watkow typu Zwierzak
z: array(1..8) of Zwierzak;
begin -- oraz ustawienie ich parametrow (typow i nazw)
z(1).Init(Pies, "Azor");
z(2).Init(Pies, "Reksio");
z(3).Init(Kot, "Kicia");
z(4).Init(Pies, "Burek");
z(5).Init(Kot, "Mruczus");
z(6).Init(Stwor, "Yeti");
z(7).Init(Stwor, "Dziubdziub");
z(8).Init(Pies, "Pluto");
end zwierzaki;