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.
1 comentarios:
Hola,
Te agaradezco que compartieras este código. Me ha ayudado.
Saludos.
Publicar un comentario