Title: Concurrencia en Ada
1Concurrencia en Ada
2Invocación remota en Ada
- Puntos de entrada (entries)
- Construcción accept
- Espera selectiva con select
- Espera selectiva con guardas
- Terminación de tareas (terminate y abort)
3La cita (rendez-vous)
- Las tareas en Ada pueden dialogar unas con otras
mediante paso de mensajes. - Se hace mediante el mecanismo de cita o
rendez-vous (que significa sincronización e
intercambio de información entre dos tareas dadas)
4Escenarios de citas
5Puntos de entrada (entries)
- La cita entre dos tareas se produce como
consecuencia de la llamada de una tarea a un
punto de entrada declarado en otra tarea. - Los puntos de entrada se declaran en la
especificación de una tarea, de forma similar a
la declaración de un procedimiento en la
especificación de un paquete.
task EJEMPLO is entry SIN_PARAMETROS entry
CON_PARAMETROS(Ain INTEGERBout FLOAT Cin out
BOOLEAN) private entry ..... end EJEMPLO
6Puntos de entradaparámetros
- Un punto de entrada puede tener parámetros in,
out e in out - Los parámetros son el medio para el intercambio
de información entre las dos tareas que dialogan
en la cita. - Si en la declaración de un punto de entrada no
hay parámetros significa que el punto de entrada
sirve únicamente como una señal de
sincronización.
7Llamada a un punto de entrada
- Se llama a un punto de entrada con la misma
sintaxis que una llamada a procedimiento. - Nombre_de_tarea . Punto_de_entrada (args)
... TareaSalón.Enciende_La_Luz ... Spooler.Imprim
e(fichero.txt, modo gt borrador) ...
8Recepción de las llamadas
- Una tarea elige cómo y cuando recibir las
llamadas que se le hacen. - De hecho, puede no contestar nunca a una llamada.
- La recepción de llamadas se realiza con la
construcción accept.
9Sentencias accept
- Las sentencias que se ejecutarán durante una cita
se describen mediante las sentencias accept
correspondientes - Las sentencias accept se encuentran dentro del
cuerpo de la tarea.
task body EJEMPLO is begin ... accept
SIN_PARAMETROS do --conjunto de sentencias
que se ejecutarán en la cita
--correspondiente al punto de entrada
SIN_PARAMETROS exception end
SIN_PARAMETROS ... accept
CON_PARAMETROS(Ain INTEGERBout FLOATCin out
BOOLEAN) do --conjunto de sentencias que se
ejecutarán en la cita --correspondiente al
punto de entrada CON_PARAMETROS end
CON_PARAMETROS end A
10Vista completa
task EJEMPLO is entry SIN_PARAMETROS entry
CON_PARAMETROS(Ain INTEGERBout FLOAT Cin out
BOOLEAN) end EJEMPLO task body EJEMPLO
is begin ... accept SIN_PARAMETROS do
--conjunto de sentencias que se ejecutarán en la
cita --correspondiente al punto de entrada
SIN_PARAMETROS end SIN_PARAMETROS ...
accept CON_PARAMETROS(Ain INTEGERBout
FLOATCin out BOOLEAN) do --conjunto de
sentencias que se ejecutarán en la cita
--correspondiente al punto de entrada
CON_PARAMETROS end CON_PARAMETROS ... end
A
11La cita o rendez-vous
task PEON is entry PREPARAR_MEZCLA(cantidadin
INTEGER) end PEON task body PEON is begin
loop --Peón haciendo otros trabajos
... accept PREPARAR_MEZCLA(cantidad in
INTEGER) do --prepara la mezcla
... -mezcla preparada end
PREPARAR_MEZCLA end loop end PEON
task ALBAÑIL task body ALBAÑIL is cantidad
integer begin loop --Trabajando
... PEON.PREPARAR_MEZCLA(cantidad)
... end loop end ALBAÑIL
12Sentencia Select
select accept A(X out item) do
--sentencias end --más sentencias or
accept B(Xin item) do --sentencias
end --más sentencias or ... end select
13Sentencia Select con guardas
- Las guardas se evalúan una sola vez, cuando la
tarea entra en la construcción select. - La tarea se queda esperando en los accept que
tienen las guardas evaluadas a cierto. - Si todas las guardas son falsas se eleva la
excepción PROGRAM_ERROR - Si una guarda no existe se considera when true
select when condicion1 gt accept A(X out
item) do --sentencias end --más
sentencias or when condicion2 gt accept
B(Xin item) do --sentencias end
--más sentencias or ... end select
14Sentencia Select (con delay)
select when condicion gt accept A(X out
item) do --sentencias end --más
sentencias or ... or ... or when
condicion gt --opcional delay 10MINUTOS end
select
15Sentencia Select (con else)
- Se toma el else si no hay ninguna cita
disponible. - La rama else no puede tener guardas.
- Una sentencia select no puede tener una rama
else y otra delay
select when condicion gt accept A(X out
item) do --sentencias end --más
sentencias or ... or ... else
--sentencias end select
16Atributo COUNT
- El atributo ECOUNT devuelve el número de tareas
que están en la cola del punto de entrada E en el
momento de la llamada. - OJO al uso del atributo COUNT en las guardas !
- Da el número de tareas encoladas en el momento en
que la guarda se evalúa, y este puede cambiar
antes de que se acepte la cita
17Terminación de tareasterminate y abort
18Terminación construcción terminate
task type progenitora task body progenitora is
task type T task body T is loop
--cuerpo end loop end T tareaT begin
... end progenitora
- Cuándo termina la tarea padre ?
- Select con alternativa terminate
19Construcción terminate
- Se toma la alternativa terminate si la unidad de
la que la tarea depende ha llegado al final, y
por tanto, está completada - y además todas las tareas hermanas y tareas
dependientes han terminado o pueden análogamente
seleccionar una alternativa terminate
select ... or ... or terminate end select
- Puede estar guardada, pero no puede aparecer en
una sentencia select que tenga una alternativa
delay o else
20Sentencia abort
- La sentencia abort termina una o más tareas
incondicionalmente - abort Nombre_de_Tarea
21Sentencia abort (2)
- Si se aborta una tarea, entonces todas las tareas
que dependen de ella, o de un subprograma o
bloque llamados en ese momento por ella, se
abortan también.
22Sentencia abort (3)
- Situaciones
- Tarea suspendida ? se aborta sin más
- No suspendida
- Caso especial si la tarea está en medio de una
cita - La cita se completa, aunque
- Tarea llamada -gt TASKING_ERROR
- Tarea llamante -gt mientras dura la cita, queda en
un estado anormal
23Estado de una tarea
- TTERMINATED
- Cierto si T ha terminado
- TCALLABLE
- Cierto a menos que la tarea se haya completado o
terminado o se encuentre en un estado anormal
pendiente de que la aborten
24TASKING_ERROR
- Error durante la activación de alguna tarea
- TASKING _ERRROR en la unidad progenitora
- Aborta una tarea llamada durante una cita
- TASKING_ERROR en la tarea llamante
- Tareas encoladas en puntos de entrada de una
tarea servidora que es abortada - TASKING_ERROR en las tareas encoladas
25Otras situaciones de error
- Si se produce una excepción durante una cita en
la tarea llamada y no se maneja dicha excepción
en el accept correspondiente, se propaga la
excepción en ambas tareas - Si una tarea no maneja una excepción de ninguna
manera, se abandona la tarea y se pierde la
excepción