En aquest tema, explorarem els conceptes de sincronització i comunicació en Ada, especialment en el context de la programació concurrent. Ada proporciona mecanismes robustos per gestionar la concurrència, permetent als programadors escriure aplicacions segures i eficients.
Conceptes Clau
- Tasques: Unitat bàsica de concurrència en Ada.
- Objectes Protegits: Mecanisme per a la sincronització i comunicació segura entre tasques.
- Entrades i Sortides Protegides: Mètodes per gestionar l'accés a recursos compartits.
- Rendezvous: Mecanisme de comunicació directa entre tasques.
Objectes Protegits
Els objectes protegits són una característica clau d'Ada per a la sincronització i la comunicació entre tasques. Proporcionen una manera segura de compartir dades entre tasques sense necessitat de bloquejos explícits.
Definició d'un Objecte Protegit
protected type Shared_Data is procedure Write(Value : Integer); function Read return Integer; private Data : Integer := 0; end Shared_Data; protected body Shared_Data is procedure Write(Value : Integer) is begin Data := Value; end Write; function Read return Integer is begin return Data; end Read; end Shared_Data;
Explicació
- Declaració:
protected type Shared_Data
defineix un tipus protegit amb una interfície pública (procediments i funcions) i una part privada (dades compartides). - Implementació: El cos de l'objecte protegit implementa els procediments i funcions declarats.
Rendezvous
El rendezvous és un mecanisme de comunicació directa entre tasques en Ada. Permet que una tasca cridi una entrada d'una altra tasca, esperant fins que l'altra tasca estigui preparada per acceptar la crida.
Exemple de Rendezvous
task type Server is entry Request(Value : Integer); end Server; task body Server is begin loop accept Request(Value : Integer) do -- Processar la sol·licitud Put_Line("Request received: " & Integer'Image(Value)); end Request; end loop; end Server; task body Client is begin Server.Request(42); end Client;
Explicació
- Declaració:
task type Server
defineix una tasca amb una entradaRequest
. - Acceptació:
accept Request(Value : Integer)
permet que la tascaServer
accepti una crida de la tascaClient
. - Crida:
Server.Request(42)
és la crida de la tascaClient
a l'entradaRequest
de la tascaServer
.
Exercicis Pràctics
Exercici 1: Sincronització amb Objectes Protegits
Descripció: Implementa un objecte protegit que permeti a múltiples tasques incrementar un comptador de manera segura.
Codi Inicial:
protected type Counter is procedure Increment; function Value return Integer; private Count : Integer := 0; end Counter; protected body Counter is procedure Increment is begin Count := Count + 1; end Increment; function Value return Integer is begin return Count; end Value; end Counter;
Solució:
task type Worker(C : in out Counter) is end Worker; task body Worker is begin for I in 1 .. 100 loop C.Increment; end loop; end Worker; Counter_Instance : Counter; Workers : array(1 .. 10) of Worker(Counter_Instance); begin -- Esperar que totes les tasques acabin null; end;
Exercici 2: Comunicació amb Rendezvous
Descripció: Implementa un sistema on una tasca Producer
envia dades a una tasca Consumer
utilitzant el mecanisme de rendezvous.
Codi Inicial:
task type Producer is entry Send_Data(Value : Integer); end Producer; task type Consumer is entry Receive_Data(Value : out Integer); end Consumer;
Solució:
task body Producer is begin for I in 1 .. 10 loop Consumer.Receive_Data(I); end loop; end Producer; task body Consumer is Value : Integer; begin loop accept Receive_Data(Value : out Integer) do -- Processar la dada Put_Line("Data received: " & Integer'Image(Value)); end Receive_Data; end loop; end Consumer;
Errors Comuns i Consells
- Bloqueig Mutu: Assegura't que les tasques no es bloquegin mútuament esperant recursos que mai es desbloquejaran.
- Condicions de Carrera: Utilitza objectes protegits per evitar condicions de carrera quan múltiples tasques accedeixen a dades compartides.
- Rendiment: Evita l'ús excessiu de rendezvous, ja que poden introduir despeses de sincronització significatives.
Resum
En aquesta secció, hem explorat els mecanismes de sincronització i comunicació en Ada, incloent objectes protegits i rendezvous. Aquests conceptes són fonamentals per escriure aplicacions concurrents segures i eficients. Hem proporcionat exemples pràctics i exercicis per reforçar els conceptes apresos. En el proper tema, aprofundirem en la gestió d'excepcions en Ada.
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