En aquest tema, explorarem la concurrència en Ada, un dels aspectes més potents i distintius del llenguatge. Ada proporciona mecanismes robustos per a la programació concurrent, permetent la creació de programes que poden executar múltiples tasques simultàniament. Aquestes capacitats són especialment útils en sistemes en temps real i aplicacions que requereixen un alt rendiment.
Continguts
- Introducció a les Tasques en Ada
- Creació i Gestió de Tasques
- Comunicació entre Tasques
- Sincronització de Tasques
- Exemples Pràctics
- Exercicis Pràctics
- Introducció a les Tasques en Ada
En Ada, una tasca és una unitat d'execució concurrent. Les tasques poden executar-se en paral·lel, permetent que diferents parts d'un programa es processin simultàniament. Això és especialment útil en aplicacions que necessiten realitzar múltiples operacions al mateix temps, com ara sistemes de control en temps real.
Conceptes Clau
- Tasques: Unitats d'execució concurrent.
- Concurrència: Capacitat d'executar múltiples tasques simultàniament.
- Sincronització: Coordinació de l'execució de tasques per evitar conflictes.
- Creació i Gestió de Tasques
Declaració de Tasques
Per declarar una tasca en Ada, utilitzem la paraula clau task. Aquí teniu un exemple bàsic:
En aquest exemple, hem declarat un tipus de tasca anomenat Worker amb una entrada Start.
Implementació de Tasques
Després de declarar una tasca, hem d'implementar el seu cos:
Creació d'Instàncies de Tasques
Per crear una instància d'una tasca, simplement declarem una variable del tipus de tasca:
- Comunicació entre Tasques
Ada proporciona mecanismes per a la comunicació entre tasques mitjançant entrades i acceptacions. Les entrades permeten que una tasca esperi fins que una altra tasca li enviï un missatge.
Exemple de Comunicació
task type Sender is
entry Send_Message (Msg : in String);
end Sender;
task body Sender is
begin
accept Send_Message (Msg : in String) do
-- Processar el missatge
end Send_Message;
end Sender;
task type Receiver is
end Receiver;
task body Receiver is
My_Sender : Sender;
begin
My_Sender.Send_Message("Hola, món!");
end Receiver;En aquest exemple, la tasca Receiver envia un missatge a la tasca Sender mitjançant l'entrada Send_Message.
- Sincronització de Tasques
La sincronització és crucial per evitar conflictes quan múltiples tasques accedeixen a recursos compartits. Ada proporciona diversos mecanismes per a la sincronització, com ara les barreres i els objectes protegits.
Exemple de Sincronització amb Barreres
task type Sync_Task is
entry Wait_For_Others;
end Sync_Task;
task body Sync_Task is
begin
accept Wait_For_Others;
-- Codi que s'executa després de la sincronització
end Sync_Task;
- Exemples Pràctics
Exemple 1: Tasques Simples
with Ada.Text_IO; use Ada.Text_IO;
task type Simple_Task is
entry Start;
end Simple_Task;
task body Simple_Task is
begin
accept Start do
Put_Line("Tasques en execució!");
end Start;
end Simple_Task;
procedure Main is
My_Task : Simple_Task;
begin
My_Task.Start;
end Main;Exemple 2: Comunicació entre Tasques
with Ada.Text_IO; use Ada.Text_IO;
task type Communicator is
entry Send_Message (Msg : in String);
end Communicator;
task body Communicator is
begin
accept Send_Message (Msg : in String) do
Put_Line("Missatge rebut: " & Msg);
end Send_Message;
end Communicator;
procedure Main is
My_Communicator : Communicator;
begin
My_Communicator.Send_Message("Hola, Ada!");
end Main;
- Exercicis Pràctics
Exercici 1: Crear una Tasca Simple
Descripció: Crea una tasca que imprimeixi un missatge quan s'inicia.
Solució:
with Ada.Text_IO; use Ada.Text_IO;
task type My_Task is
entry Start;
end My_Task;
task body My_Task is
begin
accept Start do
Put_Line("Tasques en execució!");
end Start;
end My_Task;
procedure Main is
Task_Instance : My_Task;
begin
Task_Instance.Start;
end Main;Exercici 2: Comunicació entre dues Tasques
Descripció: Crea dues tasques, una que enviï un missatge i una altra que el rebi i l'imprimeixi.
Solució:
with Ada.Text_IO; use Ada.Text_IO;
task type Sender is
entry Send_Message (Msg : in String);
end Sender;
task body Sender is
begin
accept Send_Message (Msg : in String) do
Put_Line("Missatge rebut: " & Msg);
end Send_Message;
end Sender;
task type Receiver is
end Receiver;
task body Receiver is
My_Sender : Sender;
begin
My_Sender.Send_Message("Hola, món!");
end Receiver;
procedure Main is
Receiver_Instance : Receiver;
begin
null;
end Main;Conclusió
En aquesta secció, hem après els conceptes bàsics de les tasques i la concurrència en Ada. Hem vist com crear i gestionar tasques, com comunicar-se entre elles i com sincronitzar-les. Aquests conceptes són fonamentals per a la programació concurrent i en temps real, i proporcionen una base sòlida per a desenvolupar aplicacions complexes i eficients.
En el proper tema, explorarem els objectes protegits, que ens permetran gestionar la concurrència de manera més segura i eficient.
Curs de Programació en Ada
Mòdul 1: Introducció a Ada
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
- Operadors i Expressions
- Estructures de Control
- Bucles en Ada
- Subprogrames: Procediments i Funcions
Mòdul 3: Tipus de Dades Avançats
Mòdul 4: Programació Modular
Mòdul 5: Concurrència i Programació en Temps Real
Mòdul 6: Temes Avançats
Mòdul 7: Millors Pràctiques i Optimització
- Estil de Codi i Millors Pràctiques
- Depuració i Proves
- Optimització del Rendiment
- Consideracions de Seguretat
