Title: Concurrencia en Ada
1Concurrencia en Ada
- CaracterÃsticas avanzadas
2CaracterÃsticas avanzadas
- Requeue (reencolamiento)
- Familias de puntos de entrada
- Llamada temporizada
- Llamada condicional
- Select asÃncrono
3Requeue
- requeue punto de entrada
- Encola una tarea en un punto de entrada de
- la misma tarea
- otra tarea
- un objeto protegido
- Pasa implÃcitamente los parámetros de la llamada
original - No pueden pasarse parámetros explÃcitamente
- No se puede abortar a una tarea que realice un
operación requeue, salvo - requeue punto de entrada with abort
4Requeue ejemplo
protected Event is entry wait entry
signal private entry reset
OcurredbooleanFalse end Event protected
body Event is entry wait when Ocurred is
begin null end wait
entry signal when True is begin if
waitcountgt0 then OcurredTrue
Requeue reset end if end signal
entry reset when waitcount0 is begin
OcurredFalse end reset end Event
5Llamada temporizada
- La sentencia select sólo puede tener una llamada
a un punto de entrada y sin guarda
select Peon.Preparar_Mezcla(cantidad) or
delay 1MINUTE --HAGO OTRAS COSAS Y ME OLVIDO
--DE LA MEZCLA end select
6Llamada condicional
- La sentencia select sólo puede tener una llamada
a un punto de entrada y sin guarda
select Peon.Preparar_Mezcla(cantidad) else
--HAGO OTRAS COSAS Y ME OLVIDO --DE LA
MEZCLA end select
7Select asÃncrono(Asyncronous Transfer Control-
ATC)
- Permite abandonar una actividad bajo determinadas
circunstancias, pudiéndose ejecutar en ese caso
un conjunto alternativo se sentencias
select --delay 5.0 --o Llamada a un punto de
entrada --sentencias alternativas then abort
--otras sentencias end select
Sentencias alternativas
1
Parte que se puede abortar
2
8Ejemplo cálculo iterativo
protected Result is procedure Set_Estimate(Xin
Data) function Get_Estimate return
Data private The_EstimateData end
protected Trigger is entry wait procedure
signal private FlagBooleanFalse end
Tarea esclava
Tarea controladora
... select Trigger.wait then abort --Obtener
una estimación nueva_est Result.Set_Estimate(nue
va_est) end select ...
... Trigger.signal Final_AnswerResult.Get_Estim
ate ...
9Familia de puntos de entradas. Tareas
type peticion is integer range 1..3 task
Servidor is entry Sevir(peticion)(params) end
Servidor task body Servidor is begin loop
select when guarda1 gt accept
Servir(1)(params) do ... end
Servir or when guarda2 gt accept
Servir(2)(params) do ... end
Servir or
when guarda3 gt accept
Servir(3)(params) do ... end
Servir end select end loop end Servidor
10Familia de puntos de entradas. Tareas
type peticion is integer range 1..3 task
Servidor is entry Sevir(peticion)(params) end
Servidor task body Servidor is begin loop
for P in peticion loop select
accept Servir(p)(params) do ...
end Servir exit else
null end select end loop end
loop end Servidor
11Familia de puntos de entradas. Objetos protegidos
type peticion is integer range 1..3 protected
Servidor is entry Sevir(peticion)(params) end
Servidor protected body Servidor is function
Condicion(Ppeticion) return boolean is begin
... end Condicion entry Servir(for P in
peticion)(params) when Condicion(P) is begin
Accion(params) end Servir end Servidor