Hola a todos, después de bastante tiempo sin escribir, dejo aquí la solución al típico problema de programación concurrente "
La cena de los filósofos", programado en ADA mediante paso de mensajes. Me ha servido como base para realizar unas prácticas en la asignatura "Programación en tiempo real", correspondiente a 5º curso de Ingeniería Informática.
Lo dejo aquí por si alguien alguna vez lo necesita...
with Ada.Text_IO;
with Ada.Integer_Text_IO;
with Ada.Numerics.Float_Random;
use Ada.Text_IO;
use Ada.Integer_Text_IO;
use Ada.Numerics.Float_Random;
procedure FilosofoMensajes is
G:Generator; -- Generador de números aleatorios
Comenzar:boolean:=false; --Variable para que dar comienzo al programa
NVeces:Integer:=10;
NFilosofos:Integer:=5;
type Atenedores is array(1..NFilosofos) of boolean;
task Mesa is
entry coger(F:in Integer;Salida:out boolean);
entry soltar(F:in Integer);
end Mesa;
task body Mesa is
Tenedores:Atenedores:=(others=>false);
begin
loop
select
accept coger(F:in Integer;Salida:out boolean) do
Salida:=Tenedores(F)=false and Tenedores((F mod NFilosofos) +1)=false;
if(Salida)
then
Tenedores(F):=true;
Tenedores((F mod NFilosofos) +1):=true;
end if;
end coger;
or accept soltar(F:in Integer) do
Tenedores(F):=false;
Tenedores((F mod NFilosofos) +1):=false;
end soltar;
or terminate;
end select;
end loop;
end Mesa;
task type Filosofo(F:Integer);
task body Filosofo
is
cogidos:boolean:=false;
begin
loop
exit when comenzar;
delay Duration(Random(G));
end loop;
for J in 1..NVeces
loop
put("estoy pensando....");
put(F);
put("veces");
put(J);
new_line;
delay Duration(Random(G));
put("quiero comer....");
put(F);
put("veces");
put(J);
new_line;
--espera sin consumir cpu
loop
Mesa.coger(F,cogidos);
exit when cogidos;
delay Duration(Random(G));
end loop;
put("comiendo....");
put(F);
put("veces");
put(J);
new_line;
delay Duration(Random(G));
Mesa.soltar(F);
put("termine de comer....");
put(F);
put("veces");
put(J);
new_line;
put("descansando....");
put(F);
put("veces");
put(J);
new_line;
delay Duration(Random(G));
end loop;
end Filosofo;
type ptr_Filosofo is access Filosofo;
Filosofos:array(1..NFilosofos) of ptr_Filosofo;
begin
put("Programa de la cena de los filosofos");
new_line;
put("n filosofos: ");
put(NFilosofos);
new_line;
put("n veces");
put(NVeces);
new_line;
for K in 1..NFilosofos
loop
Filosofos(K):=new Filosofo(K);
end loop;
comenzar:=true;
end;
Saludos y hasta la próxima.