Mam rozwiązać w Adzie klasyczny problem producentów i konsumentów.
Napisałem już (prawdopodobnie poprawnie) zadania, ale niestety nie jestem w stanie ich wywołać. Gdyby ktoś pomógł mi w napisaniu głównego programu to byłoby bardzo miło.
with ada.text_io, ada.integer_text_io, ada.numerics.discrete_random;
use ada.text_io, ada.integer_text_io;
with pakiet_z_semaforami; use Pakiet_z_Semaforami;
procedure program is
max_number_of_processes: integer:=30;
N: integer:=10;
sprod, skons:sem;
pusty, pelny:sem;
wskbufprod:integer:=0;
wskbufkons:integer:=0;
buf:array(1..n) of integer;
number_of_prod : integer;
number_of_Kons : integer;
task type prod (Nr_prod: integer:=0);
task type kons (Nr_Kons: integer:=0);
type pointer_Prod is access Prod;
type pointer_Kons is access Kons;
subtype size is integer range 1..max_number_of_processes;
Nr_Prod: array(size) of pointer_Prod;
Nr_Kons: array(size) of pointer_Kons;
local_time, critical_time: array (size) of duration;
package duration_io is new fixed_io(duration);
task body prod is
x:integer;
lok:integer;
begin
loop
Put("Produkuje "); put(Nr_prod); new_line;
delay(local_time(Nr_prod));
X:=Nr_prod;
pusty.wait;
sprod.wait;
wskbufprod:=(wskbufkons mod n)+1;
lok:=wskbufprod;
sprod.signal;
buf(lok):=X;
Put("Umieszcza "); put(Nr_prod); new_line;
delay(critical_time(Nr_prod));
Pelny.Signal;
end loop;
end prod;
task body kons is
y:integer;
ylok:integer;
begin
loop
Put("Konsumuje "); put(Nr_kons); new_line;
delay(local_time(Nr_kons));
y:=Nr_kons;
pelny.wait;
skons.wait;
wskbufkons:=(wskbufprod mod n)+1;
ylok:=wskbufkons;
skons.signal;
buf(ylok):=y;
Put("Czeka "); put(Nr_kons); new_line;
delay(critical_time(Nr_kons));
Pusty.Signal;
end loop;
end kons;
begin
null;
end program;
pakiet z semaforami
package pakiet_z_semaforami is
task type sem_bin is
entry Wait;
entry Signal;
end Sem_bin;
task type sem is
entry Inicjalizuj(N : in Integer; m : in Integer);
entry wait;
entry signal;
end Sem;
end pakiet_z_semaforami;
ciało pakietu
package body pakiet_z_semaforami is
task body sem_bin is
begin
loop
select
accept wait;
accept Signal;
or terminate;
end select;
end loop;
end sem_bin;
task body sem is
licznik : integer;
max : Integer;
begin
accept Inicjalizuj(N : in Integer; m : in Integer) do
licznik:=n;
Max:=M;
end Inicjalizuj;
loop
select
when Licznik >0 =>
accept Wait do
licznik:=licznik-1;
end Wait;
or
when Licznik < Max =>
accept Signal do licznik:=licznik+1;
End Signal;
or terminate;
end select;
end loop;
end Sem;
end pakiet_z_semaforami;