W pewnej firmie klienci zlecają zadania do wykonania określając ich
priorytet (od 0 do 9, im wyższy tym bardziej pilne) a wykonawcy realizują
te zlecenia. Zadaniem dyspozytora jest przekazanie wykonawcy do
realizacji odpowiedniego zadania - o aktualnie najwyższym priorytecie.
Wątki klientów zgłaszają zadania wraz z ich priorytetami wywołując
odpowiednie entry wątku Dyspozytor (do zdefiniowania przez Państwa;
wątek o numerze id powinien zgłaszać zadanie o priorytecie id i
unikalnym numerze). Wątki wykonawców wywołują entry nastepne i
otrzymują w parametrze wyjściowym numer niezrealizowanego jeszcze
zadania o najwyższym priorytecie, po czym przystępują do jego
wykonania. Rozwiazać ten problem przy założeniu, że zadania o równych
priorytetach powinny być realizowane w kolejności zgłaszania (FIFO).
Uwaga: istnieje możliwość zdefiniowania ”rodziny” wejść, np. pisząc:
task AAA is
entry Z(0..9)(parametry)
end AAA;
otrzymamy w zadaniu AAA dziesięć wejść: Z(0), Z(1),. . . , Z(9), każde o
tych samych parametrach, które następnie można wykorzystać w bloku
select (a nawet w pętli for, np. for i ... accept Z(i) ... ).
with Ada.Text_IO;
use Ada.Text_IO;
procedure Przydzial is
----- watek nadzorujacy przydzial zadan -----
task Dyspozytor is
--<-- TU DODATKOWE WEJSCIA
entry nastepne(nr: out Integer); -- zwraca numer nastepnego zadania do wykonania (o najwyzszym priorytecie)
end Dyspozytor;
task body Dyspozytor is
begin
--<-- TU KOD -->--
end Dyspozytor;
----- koniec watku nadzorujacego -----
----- watek klienta -----
task type Klient(id: Integer);
task body Klient is
begin
loop
--<-- TU KOD -->--
delay Duration(Float(id)); -- aby zadania o wyzszym priorytecie pojawialy sie rzadziej
end loop;
end Klient;
----- koniec klienta -----
----- watek wykonawcy -----
task type Wykonawca(id: Integer);
task body Wykonawca is
nrZadania: Integer;
begin
loop
Put_Line("Wykonawca" & Integer'Image(id) & " oczekuje na zamowienia.");
delay 0.5;
Dyspozytor.nastepne(nrZadania);
Put_Line("Wykonawca" & Integer'Image(id) & " realizuje zamowienie nr" & Integer'Image(nrZadania));
delay 2.0;
end loop;
end Wykonawca;
----- koniec wykonawcy -----
-- INICJALIZACJA
a: Klient(1);
b: Klient(2);
c: Klient(8);
d: Klient(5);
e: Wykonawca(1);
f: Wykonawca(2);
begin
null; -- instrukcja pusta ale watki (zadania) klientow, wykonawcow oraz dyspozytora zostaly utworzone i dzialaja
end przydzial;