Beruflich Dokumente
Kultur Dokumente
Facultad de Informática
UNLP
El lenguaje ADA
2
Tasks
4
Sincronización
Entry
El rendezvous es el principal mecanismo de sincronización en Ada y
también es el mecanismo de comunicación primario.
Entry:
• Declaración de entry simples y familia de entry (parámetros IN, OUT y IN OUT).
TASK nombre IS
ENTRY e1;
ENTRY e2 (p1: IN integer; p2: OUT char; p3: IN OUT float);
end;
Los entry’s funcionan de manera semejante a los procedimientos: solo pueden recibir
o enviar información por medio de los parámetros del entry. No retornan valores
como las funciones.
5
Sincronización
Call: Entry Call
Opciones para Entry Call:
• Entry call. La ejecución demora al llamador hasta que la operación termine (o
aborte o alcance una excepción).
• Entry call condicional (SELECT-ELSE) :
select entry call;
sentencias adicionales;
else
sentencias;
end select;
6
Sincronización
Sentencia de Entrada: Accept
La tarea que declara un entry sirve llamados al entry con accept:
accept nombre (parámetros formales) do
sentencias
end nombre;
Demora la tarea hasta que haya una invocación, copia los parámetros
reales en los parámetros formales, y ejecuta las sentencias. Cuando
termina, los parámetros formales de salida son copiados a los parámetros
reales. Luego ambos procesos continúan.
Ejemplo:
accept e2 (p1: IN integer; p2: OUT char; p3: IN OUT float) do
sentencias
end e2;
7
Sincronización
Sentencia de Entrada: Accept
Es posible que una tarea tenga pendiente más de un entry call diferente
8
Ejemplo
Atención en un banco
9
Ejemplo
Atención en un banco
Procedure Banco is
TASK Body Empleado IS
TASK Type Cliente; Begin
loop
TASK Type Empleado IS Accept atención () do
entry atencion (); -- atender
end Empleado; End atención
End loop;
End Empleado;
emp: Empleado;
clientes: array (1..C) of Cliente; Begin
Null;
End Banco
TASK Body Cliente IS
Begin
Emp.atencion(); -- Pedir atención
End Cliente;
10
Ejemplo
Atención en un banco
Procedure Banco is
TASK Body Empleado IS
TASK Type Cliente; Begin
loop
TASK Type Empleado IS Accept atención () do
entry atencion (); -- atender
end Empleado; End atención
End loop;
End Empleado;
emp: Empleado;
clientes: array (1..C) of Cliente; Begin
Null;
End Banco
TASK Body Cliente IS
Begin
Emp.atencion(); -- Pedir atención
End Cliente;
11
Ejemplo
Atención en un banco
Procedure Banco is
TASK Body Empleado IS
TASK Type Cliente; Begin
loop
TASK Type Empleado IS Accept atención () do
entry atencion (); -- atender
end Empleado; End atención
End loop;
End Empleado;
emp: Empleado;
clientes: array (1..C) of Cliente; Begin
Null;
End Banco
TASK Body Cliente IS
Begin
SELECT
Emp.atencion(); -- Pedir atención
OR DELAY (10*60)
-- retirarse;
Null;
End SELECT;
End Cliente;
12
Ejemplo
Atención en un banco
Procedure Banco is
TASK Body Empleado IS
TASK Type Cliente; Begin
loop
TASK Type Empleado IS Accept atención () do
entry atencion (); -- atender
end Empleado; End atención
End loop;
End Empleado;
emp: Empleado;
clientes: array (1..C) of Cliente; Begin
Null;
End Banco
TASK Body Cliente IS
Begin
SELECT
Emp.atencion(); -- Pedir atención
OR DELAY (10*60)
-- retirarse; Si los clientes no son atendidos
Null; inmediatamente, entonces se retiran.
End SELECT; ¿Qué modificaciones debería hacer?
End Cliente;
13
Ejemplo
Atención en un banco
Procedure Banco is
TASK Body Empleado IS
TASK Type Cliente; Begin
loop
TASK Type Empleado IS Accept atención () do
entry atencion (); -- atender
end Empleado; End atención
End loop;
End Empleado;
emp: Empleado;
clientes: array (1..C) of Cliente; Begin
Null;
End Banco
TASK Body Cliente IS
Begin
SELECT
Emp.atencion(); -- Pedir atención
ELSE
-- retirarse;
Null;
End SELECT;
End Cliente;
14
Ejemplo
Atención en un banco
Procedure Banco is
TASK Body Empleado IS
TASK Type Cliente; Begin
loop
TASK Type Empleado IS Accept atención () do
entry atencion (); -- atender
end Empleado; End atención
End loop;
End Empleado;
emp: Empleado;
clientes: array (1..C) of Cliente; Begin
Null;
End Banco
TASK Body Cliente IS
Begin
SELECT
Emp.atencion(); -- Pedir atención
ELSE
-- retirarse; Si ahora hay 2 tipos de clientes
Null; (regular y prioritario). ¿Qué
End SELECT; modificaciones debería hacer?
End Cliente;
15
Ejemplo
Atención en un banco
Begin
Null;
End Banco
16
Ejemplo
Atención en un banco
17
Ejemplo
Atención en un banco
18
Ejemplo
Atención en un banco
Begin
for i in 1..C loop
Cliente(i).identificacion(i);
ClientePrioritario(i).identificacion(i);
end loop;
End Banco
19