Вы находитесь на странице: 1из 25

Concurrencia en Ada

Invocacin remota

Invocacin remota en Ada


Puntos de entrada (entries) Construccin accept Espera selectiva con select Espera selectiva con guardas Terminacin de tareas (terminate y abort)

La 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 sincronizacin e intercambio de informacin entre dos tareas dadas)

Escenarios de citas
Proceso A Proceso B Proceso A Proceso B

B.pe accept pe begin ... end;

accept pe

B.pe

begin ... end

Puntos 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 especificacin de una tarea, de forma similar a la declaracin de un procedimiento en la especificacin de un paquete.
task EJEMPLO is entry SIN_PARAMETROS; entry CON_PARAMETROS(A:in INTEGER;B:out FLOAT; C:in out BOOLEAN); private entry .....; end EJEMPLO;

Puntos de entrada: parmetros

Un punto de entrada puede tener parmetros in, out e in out Los parmetros son el medio para el intercambio de informacin entre las dos tareas que dialogan en la cita. Si en la declaracin de un punto de entrada no hay parmetros significa que el punto de entrada sirve nicamente como una seal de sincronizacin.

Llamada 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)

... TareaSaln.Enciende_La_Luz; ... Spooler.Imprime(fichero.txt, modo => borrador); ...

Recepcin de las llamadas

Una tarea elige cmo y cuando recibir las llamadas que se le hacen.

De hecho, puede no contestar nunca a una llamada.

La recepcin de llamadas se realiza con la construccin accept.

Sentencias accept

Las sentencias que se ejecutarn 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 ejecutarn en la cita --correspondiente al punto de entrada SIN_PARAMETROS [exception:] end SIN_PARAMETROS; ... accept CON_PARAMETROS(A:in INTEGER;B:out FLOAT;C:in out BOOLEAN) do --conjunto de sentencias que se ejecutarn en la cita --correspondiente al punto de entrada CON_PARAMETROS end CON_PARAMETROS; end A;

Vista completa
task EJEMPLO is entry SIN_PARAMETROS; entry CON_PARAMETROS(A:in INTEGER;B:out FLOAT; C:in out BOOLEAN); end EJEMPLO; task body EJEMPLO is begin ... accept SIN_PARAMETROS do --conjunto de sentencias que se ejecutarn en la cita --correspondiente al punto de entrada SIN_PARAMETROS end SIN_PARAMETROS; ... accept CON_PARAMETROS(A:in INTEGER;B:out FLOAT;C:in out BOOLEAN) do --conjunto de sentencias que se ejecutarn en la cita --correspondiente al punto de entrada CON_PARAMETROS end CON_PARAMETROS; ... end A;

La cita o rendez-vous
task PEON is entry PREPARAR_MEZCLA(cantidad:in INTEGER); end PEON; task body PEON is begin loop --Pen haciendo otros trabajos ... accept PREPARAR_MEZCLA(cantidad: in INTEGER) do --prepara la mezcla ... -mezcla preparada end PREPARAR_MEZCLA; end loop; end PEON;

task ALBAIL;
task body ALBAIL is cantidad: integer; begin loop --Trabajando ... PEON.PREPARAR_MEZCLA(cantidad); ... end loop; end ALBAIL;

Sentencia Select
select accept A(X: out item) do --sentencias end; --ms sentencias or accept B(X:in item) do --sentencias end; --ms sentencias or ... end select;

Sentencia Select con guardas


select when condicion1 => accept A(X: out item) do --sentencias end; --ms sentencias or when condicion2 => accept B(X:in item) do --sentencias end; --ms sentencias or ... end select;

Las guardas se evalan una sola vez, cuando la tarea entra en la construccin 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 excepcin PROGRAM_ERROR

Si una guarda no existe se considera when true

Sentencia Select (con delay)


select when condicion => accept A(X: out item) do --sentencias end; --ms sentencias or ... or ... or [when condicion =>] --opcional delay 10*MINUTOS; end select;

Sentencia Select (con else)


select [when condicion =>] accept A(X: out item) do --sentencias end; --ms sentencias or ... or ... else --sentencias end select;

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

Atributo COUNT

El atributo ECOUNT devuelve el nmero de tareas que estn 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 nmero de tareas encoladas en el momento en que la guarda se evala, y este puede cambiar antes de que se acepte la cita

Terminacin de tareas: terminate y abort

Terminacin: construccin terminate


task type progenitora; task body progenitora is task type T; task body T is loop --cuerpo end loop; end T; tarea:T; begin ... end progenitora;

Cundo termina la tarea padre ?

Select con alternativa terminate

Construccin 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 adems todas las tareas hermanas y tareas dependientes han terminado o pueden anlogamente 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

Sentencia abort

La sentencia abort termina una o ms tareas incondicionalmente abort Nombre_de_Tarea;

Sentencia 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 tambin.

Sentencia abort (3)

Situaciones

Tarea suspendida se aborta sin ms No suspendida

Caso especial: si la tarea est en medio de una cita


La cita se completa, aunque Tarea llamada -> TASKING_ERROR Tarea llamante -> mientras dura la cita, queda en un estado anormal

Estado 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

TASKING_ERROR

Error durante la activacin de alguna tarea

TASKING _ERRROR en la unidad progenitora TASKING_ERROR en la tarea llamante

Aborta una tarea llamada durante una cita

Tareas encoladas en puntos de entrada de una tarea servidora que es abortada

TASKING_ERROR en las tareas encoladas

Otras situaciones de error

Si se produce una excepcin durante una cita en la tarea llamada y no se maneja dicha excepcin en el accept correspondiente, se propaga la excepcin en ambas tareas

Si una tarea no maneja una excepcin de ninguna manera, se abandona la tarea y se pierde la excepcin

Вам также может понравиться