← Concurrencia Tareas Tareas/Sincronización mediante citas →


Definición de tareas

editar

En Ada, a la unidad de proceso secuencial que puede ser ejecutada paralelamente se le denomina task. Es la representación explícita de un proceso (o tarea).

Como en otras construcciones, la tarea de Ada presenta una especificación (interfaz con el exterior) y un cuerpo (descripción del comportamiento dinámico).

La sintaxis de la especificación de una tarea es:

especificación_tarea ::=
  task identificador [ is
    { punto_entrada_tarea | cláusula_representación }
  [ private { punto_entrada_tarea | cláusula_representación } ]
  end [ identificador ] ] ;
punto_entrada_tarea ::=
  entry identificador [ ( tipo | rango ) ] [ ( parámetro { , parámetro } ) ] ;

La sintaxis del cuerpo de una tarea es:

cuerpo_tarea ::=
  task body identificador is
    [ parte_declarativa ]
  begin
    secuencia_de_sentencias
  end [ identificador ] ;

Por ejemplo, dos procesos que escriben un texto por pantalla:

with Ada.Text_IO; use Ada.Text_IO;

procedure Tareas_tontas is

  task Tarea1;
  task Tarea2;

  task body Tarea1 is
  begin
    loop
      Put ("Soy la tarea 1.");
    end loop;
  end Tarea1;

  task body Tarea2 is
  begin
    loop
      Put ("Soy la tarea 2.");
    end loop;
  end Tarea2;

begin
  -- En este momento comienzan a ejecutarse ambas tareas.
  Put ("Soy el procedimiento principal.");
end Tareas_tontas;

En este caso, el orden de los mensajes que aparecen en pantalla es totalmente impredecible, depende del sistema en el que se ejecuten. Ni siquiera es predecible si las frases que vayan apareciendo serán completas o serán truncadas, esto es debido a que el sistema puede decidir suspender la ejecución de alguna tarea en cualquier instante de tiempo y la sentencia Put no es atómica. Ambas tareas comenzarán su ejecución simultáneamente (al menos lógicamente) justo después del begin del procedimiento.

Ciclo de vida y tipos

editar
 
Una tarea Ada puede cambiar de estado cuando se cumplen ciertas condiciones que dependen de si es estática o dinámica.

Hay dos tipos de tareas, según su ciclo de vida:

  • Tareas estáticas:
    • Dependen del bloque donde se declaran.
    • Se activan justo antes de que se ejecuten las instrucciones del bloque donde fueron declaradas.
    • Terminan cuando todas sus tareas hijas terminen y llegue a su última instrucción.
  • Tareas dinámicas (mediante punteros):
    • Dependen del bloque donde se define el tipo puntero.
    • Se activan con la sentencia new.
    • Las tareas hijas pueden seguir existiendo cuando se termine su progenitora.

Existen atributos asociados a las tareas, entre otros:

  • Tarea'Callable indica falso si la tarea está completada o terminada, en otro caso (ejecutándose o suspendida), verdadero.
  • Tarea'Terminated indica verdadero si la tarea ha terminado.

Indicar tan sólo, que una tarea se puede terminar abruptamente mediante la sentencia abort y para redirigir una llamada a un punto de entrada que esté encolada hacia otra cola, se emplea la sentencia requeue.

Ejemplo

editar

Para un sistema de control de presión y temperatura, se puede realizar el control de ambas magnitudes simultáneamente:

with Paquete_control_temperatura; use Paquete_control_temperatura;
with Paquete_control_presión; use Paquete_control_presión;

procedure Control_temperatura_y_presión

  task Control_temperatura;
  task Control_presión;

  task body Control_temperatura is
    Temperatura: TTemperatura;
    Temperatura_referencia: TTemperatura := 55;
    AcciónCalefactor: TAcciónCalefactor;
  begin
    loop
      Temperatura := Leer;
      AccciónCalefactor := Control (Temperatura, Temp_referencia);
      Escribir (AcciónCalefactor);
      delay (2.0);
    end loop;
  end Control_temperatura;

  task body Control_presión is
    Presión: TPresión;
    Presión_referencia: TPresión := 315;
    PosiciónValvula: TPosiciónVálvula;
  begin
    loop
      Presión := Leer;
      PosiciónVálvula := Control (Presión, Presión_referencia);
      Escribir (PosiciónVálvula);
      delay (3.0);
    end loop;
  end Control_presión;

begin
  -- Comienzan a ejecutarse Control_temperatura y Control_presión;
  null; -- Un cuerpo de procedimiento no puede estar vacío.
end Control_temperatura_y_presión;

En el preciso instante en el que comienza a ejecutarse el procedimiento, hay tres procesos ejecutándose simultáneamente, el procedimiento y las dos tareas.

Manual de referencia de Ada

editar