background image

Wspó

łbieżność w języku Ada 

                                              

 1

 

 

ADA-wspolbiezn-26 

Współbieżność w jezyku ADA 

 
1. Zadania 

Podstawowym mechanizmem osi

ągania współbieżności w języku Ada są 

zadania (ang. 

Tasks). Zadanie jest procesem systemu operacyjnego. 

Zadania wykonuj

ą się współbieżnie a gdy sprzęt na to pozwala mogą 

wykonywa

ć się równolegle. Każde zadanie może statycznie lub 

dynamicznie tworzy

ć inne zadania.  

 

Tworzenie i kończenie zadań  

Zadanie jest tworzone gdy zako

ńczy się opracowywanie jego deklaracji. 

 
Zadanie jest ko

ńczone gdy: 

• 

Zadanie wykona

ło ostatnią instrukcję, instrukcję 

terminate

, lub 

wykonano na nim instrukcj

ę 

abort

• 

Spe

łnione są warunki do zakończenia zadania bez utraty spójności  

aplikacji to znaczy wszystkie zadania zale

żne zakończyły się lub 

oczekuj

ą na zakończenie. 

 

1.1  Typ zadaniowy 
Typ zadaniowy jest typem z

łożonym. Definicja typu składa się z dwóch 

cz

ęści: 

• 

Specyfikacji (ang. 

Specification

• 

Tre

ści (ang. Body). 

                                                                                                    
Specyfikacja okre

śla : 

• 

Interfejs obiektu – czyli te elementy które maj

ą być widoczne na 

zewn

ątrz (wejścia do zadania). 

• 

Elementy prywatne dla danego typu. 

 
Tre

ść  określa implementacje elementów określonych w interfejsie 

(wej

ść) oraz innych działań wykonywanych przez zadanie.                                      

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 2

 

 

ADA-wspolbiezn-26 

 
Specyfikacja_typu_zadaniowego ::= 

task type

 Nazwa_typu [Wyró

żnik_typu] 

[

is 

 

  {Deklaracja_wej

ścia | Klauzula_reprezentacji} 

[

private

  

  {Deklaracja_wej

ścia | Klauzula_reprezentacji} ] 

end

 [Nazwa_typu]]; 

 
Deklaracja_wej

ścia := 

entry

 Nazwa_wej

ścia [(Zakres_dyskretny)] [(Parametry_formalne)] 

 

Definicja 1-1 Specyfikacja typu zadaniowego 

 

• 

Wyró

żnik typu określa parametry przekazywane do tworzonych 

instancji danego typu (np. numer procesu).  

• 

Wej

ścia określone w części publicznej mogą zostać wywołane przez 

inne zadania. Wej

ścia zawierają po nazwie parametry formalne (takie 

jak parametry procedury). 

• 

Klauzule reprezentacji okre

ślają szczegóły implementacyjne (adresy 

fizyczne, priorytet) 

• 

Zakres_dyskretny umo

żliwia indeksowanie wejść 

 
Specyfikacja typu zadaniowego okre

śla jego interfejs. Implementacja 

opisana jest w tre

ści (ang. Body) zadania. 

 
task bufor is 
 

entry wstaw(x : in Integer); 

 

entry wez(x : out Integer); 

end bufor; 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 3

 

 

ADA-wspolbiezn-26 

Tre

ść_zadania ::= 

task body

 Nazwa_zadania 

is  

[Deklaracje] 

begin

 

  {[Sekwencja_instrukcji1]  
   [Instrukcja_accept] 
   [Sekwencja_instrukcji2]} 
 [

exception

  obs

ługa_wyjątków]  

end

 [Nazwa_zadania]; 

 
Instrukcja_accept := 

accept 

Nazwa_wej

ścia [(Podtyp_dyskretny)] [(Parametry_formalne)]  

      [

do

 

       Sekwencja_instrukcji2 

end

 [Nazwa_wej

ścia]]; 

 

Definicja 1-2 Wn

ętrze zadania 

 

with Ada.Text_IO;    use ada.text_io;               
with Ada.Integer_Text_IO;           
procedure task1 is 

   --  Specyfikacja typu intro_task 
   task type intro_task (message : Integer); 
 

   task body intro_task is       --  Definicja tresci zadania 
     begin 
      for count IN 1..10 loop 

        Ada.Text_IO.put (Item => "Zadanie "); 
        Ada.Integer_Text_IO.put (Item => message, Width => 1); 
        Ada.Text_IO.new_line; 

        delay 1.0; 
       end loop; 

     end intro_task; 
 
     -- W odróznieniu od procedur zadania nie są wywoływane 

     -- Są one aktywowane gdy program startuje 
 
     Task_1 : intro_task (1); 

     Task_2 : intro_task (2); 
     Task_3 : intro_task (3); 
begin 

   put_line("Zadanie glowne "); 
end task1; 

Przyk

ład 1-1 Zadania współbieżne 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 4

 

 

ADA-wspolbiezn-26 

 

Wykonywane wspó

łbieżnie zadania mogą oddziaływać ze sobą.  

 
Wyró

żnia się następujące sposoby oddziaływania zadań: 

• 

Aktywacja i zako

ńczenie zadania 

• 

Wywo

łanie przez zadanie synchronizowanego wejścia (ang. entry

innego zadania. Jest to synchroniczna metoda komunikacji 
mi

ędzyzadaniowej. 

• 

Wywo

łanie chronionego podprogramu wchodzącego w skład obiektu 

chronionego. Podprogram taki zapewnia wy

łączny dostęp do 

wspólnych danych gdy wykonywany jest w trybie odczyt / zapis lub 
dost

ęp współbieżny gdy wykonywany jest odczytu. Jest to 

asynchroniczna metoda komunikacji mi

ędzyzadaniowej. 

• 

Asynchroniczne przekazanie sterowania jako cz

ęść wyrażenia 

select

. B

ędzie ono wznowione gdy zakończy się blok 

entry

 w 

innym zadaniu lub up

łynie timeout. 

• 

Wykonanie wyra

żenia 

abort

 pozwalaj

ące jednemu zadaniu na 

zako

ńczyć inne.  

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 5

 

 

ADA-wspolbiezn-26 

1.2  Stany zadania w języku Ada 
Cykl 

życia zadania składa się z trzech faz: 

• 

Aktywacji (ang. 

Activation) – następuje po zakończeniu opracowania 

cz

ęści zadania deklaracyjnej zadania. 

• 

Wykonania (ang. 

Execution) – zadanie umieszczone w kolejce zadań 

gotowych i b

ędzie wybierane przez procedurę szeregującą. 

• 

Zako

ńczenia (ang. Finalisation) – osiągnięcie ostatniej instrukcji, 

zg

łoszenie wyjątku który nie może być obsłużony, wykonanie instrukcji 

terminate

 w ga

łęzi 

select

, inne zadanie wykona

ło 

abort

 
 
Uwaga! 
Zadanie nie mo

że być zakończone dopóki istnieją jego niezakończone 

zadania potomne. 
 
 
 

non-existing

created

terminated

finalising

completed

activating

running

waiting child

activation

Opracowanie

zakończone

pomyślnie

utworzono

potomne

utwórz

potomne

Opracowanie

deklaracji

wyjatek w

deklaracji

usuwanie zadań

zależnych

koniec

usuwania

zakończenie

zadania

wyjątek w

trakcie

inicjaliacji

 

Rysunek 0-1 Wa

żniejsze stany zadania w języku Ada (tworzenie – 

zako

ńczenie) 

 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 6

 

 

ADA-wspolbiezn-26 

1.3  Awaryjne usunięcie zadania 
Zadanie mo

że być awaryjnie usunięte przez inne zadanie poprzez 

wykonanie instrukcji abort. 
 
 
Instrukcja_abort := 

abort

 NazwaZadania { NazwaZadania } 

 
 

 

1.4  Opóźnienia i zadania cykliczne 
W j

ęzyku Ada istnieje możliwość opóźnień relatywnych i absolutnych. 

 
Instrukcja_Delay := 

delay

 wyra

żenie_typu_Duration 

 
Instrukcja_Delay_untlil  := d

elay until

 wyra

żenie_typu_Time 

 

 

task body bufor is 
   begin 
 

loop 

 

  delay 1.0; -- czekanie 

     end loop; 
end bufor; 

 

 
Opó

źnienie o czas T sekundę nie znaczy, że dokładnie po T zadanie 

zostanie wznowione. Po tym czasie zyska status gotowo

ści a o 

uruchomieniu decyduje procedura szereguj

ąca. 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 7

 

 

ADA-wspolbiezn-26 

 
2. Spotkania 

Komunikacja miedzyzadaniowa w Adzie odbywa si

ę za pomocą: 

• 

Komunikacja synchroniczna - mechanizmu spotka

ń (ang. 

Rendezvous). 

• 

Komunikacja asynchroniczna - obiekty chronione 

 

2.1  Mechanizm spotkań 
Komunikacja mi

ędzyzadaniowa w Adzie jest komunikacją 

niesymetryczn

ą, synchroniczną. Wyróżnia się dwa rodzaje zadań: 

• 

Zadanie przyjmuj

ące (serwer) – udostępnia wejścia wykonując 

instrukcj

ę accept. 

• 

Zadanie wywo

łujące (klient) – wywołuje wejścia udostępniane przez 

serwer. 

 

Zadanie przyjmujące

Zadanie wywolujące

bufor

Buforc.Wstaw(x)

Wstaw

Pobierz

Buforc

x

 

 
Task Buforc is  
 

entry Wstaw(x: in Integer); 

 

entry Pobierz(x: out Integer); 

end Buforc; 

 

 
Zadania wywo

łujące mogą wywoływać wejścia używając notacji 

kropkowej Nazwa_zadania.nazwa_wej

ścia(parametry). 

 
Buforc.Wstaw(y); -- wywolanie wejscia 1 
Buforc.Wez(z);   -- wywolanie wejscia 2 

 

Zadanie przyjmuj

ące musi wykonać instrukcję accept

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 8

 

 

ADA-wspolbiezn-26 

task body  Buforc is 
begin 
 

... 

    -- wejscie 1 
    accept Wstaw(x: in Integer) do 
 

 

... 

    end Wstaw; 
 
    -- wejscie 2 
    accept Pobierz(x: out Integer) do 
 

 

... 

    end Pobierz; 
 
    ... 
end Buforc; 

 

Semantyka spotkania: 
Zadanie wywo

łujące przekazuje parametry do zadania przyjmującego i 

zostaje zawieszone. 

• 

Zadanie przyjmuj

ące pobiera parametry z zadania wywołującego i 

wykonuje instrukcje z tre

ści 

accept

 pomi

ędzy 

do

 i 

end

• 

Parametry wyj

ściowe 

out

 s

ą przekazywane do zadania 

wywo

łującego. 

• 

Zadanie wywo

łujące jest wznawiane. 

 
 

Zadanie przyjmujące Bufor

Zadanie wywolujące

accept Wstaw( x in Ineteger)

Bufor.Wstaw( x )

 x

end Wstaw;

 

Przypadek 1 Wykonanie 

accept

 przed wywo

łaniem wejścia 

 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 9

 

 

ADA-wspolbiezn-26 

 

Zadanie przyjmujące Bufor

Zadanie wywolujące

accept Wstaw( x in Ineteger)

Bufor.Wstaw( x )

 x

end Wstaw;

 

Przypadek 2 Wywo

łaniem wejścia przed wykonaniem 

accept

 

 
 

with Ada.Text_IO;    use ada.text_io;               
with Ada.Integer_Text_IO;           

procedure task2 is 
     --  Specyfikacja typu intro_task 
     task type intro_task (message : Integer) is   

          entry start;        
     end intro_task; 
    

     task body intro_task is --  Definicja tresci zadania 
     begin 
      accept start;   -- Wejscie do zadania 

      for count IN 1..10 loop 
        Ada.Text_IO.put (Item => "Zadanie "); 

        Ada.Integer_Text_IO.put (Item => message, Width => 1); 
        Ada.Text_IO.new_line; 
        delay 1.0; 

      end loop; 
     end intro_task; 
     -- W odróznieniu od procedur zadania nie są wywoływane 

     -- Są one aktywowane gdy program startuje 
     Task_1 : intro_task (1); 
     Task_2 : intro_task (2); 

     Task_3 : intro_task (3); 
begin 
   put_line("Zadanie glowne "); 

   Task_1.start; 
   Task_2.start; 

   Task_3.start; 
end task2; 

Przyk

ład 2-1 Synchronizacja startu zadań 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 10

 

 

ADA-wspolbiezn-26 

 

-- Przesylanie komunikatow jak w QNX 
with ada.text_io; 
use ada.text_io; 

 
procedure komunikaty is 
 

  task odbiorca is 
 

entry SendRec(x : in Integer; y: out Integer); 

  end odbiorca; 

 
  task body odbiorca is 
    maxi: constant Integer := 2; 

 

idx : Integer := 0; -- pol ost. elementu 

 

begin 

 

  loop 

          accept SendRec(x : in Integer; y : out Integer ) do 
               put_line("Accept:" & Integer'Image(x)); 

               idx := idx + 1; 
               y := idx;  
 

     end SendRec; 

       end loop; 
   end odbiorca; 
 

   task nadawca is 
   end nadawca; 
 

   task body nadawca is 
 

i,j : Integer := 0; 

 

begin 

 

  loop 

             i := i + 1; 

             put_line("Wyslalem " & Integer'Image(i)); 
             odbiorca.SendRec(i,j); 
             put_line("Odebralem " & Integer'Image(j)); 

 

     delay 1.0; 

 

  end loop; 

  end nadawca; 

   
begin 
   put_line("Start- komunikaty"); 

end komunikaty; 

Przyk

ład 2-2 Przesyłanie komunikatów pomiędzy zadaniami (jak w QNX) 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 11

 

 

ADA-wspolbiezn-26 

Zadanie przyjmuj

ące

odbiorca

Zadanie wywoluj

ące

nadawca

accept SendRec( x in, y out )

odbiorca.SendRec(x,y )

 in x

end SendRec;

out y

blokada

odblokowanie

 

Rysunek 2-1 Przekazywanie danych i wyniku w spotkaniu. 

 
 
 

zadanie wywolujące

zadanie przyjmujące

Ready

czekaj na

wykonanie accept

Ready

accept

odbiór danych

czekaj na

wywolanie

przekazanie wyniku

odbiorca.SendRec

odebranie wyniku

wykonanie accept

 

Rysunek 2-2 Ilustracja mechanizmu spotkania za pomoc

ą sieci Petriego 

 

żnice pomiędzy wywołaniem procedury i wywołaniem wejścia: 

1.  Wej

ścia zadania wykonywane są w trybie wzajemnego wykluczania. 

Nie obs

łużone jeszcze wywołania są kolejkowane. 

2.  Akceptacja wywo

łania może być opóźniona w czasie. 

3.  Zadanie przyjmuj

ące może zadecydować o przyjęciu lub odroczeniu 

wywo

łania w zależności od swego wewnętrznego stanu 

 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 12

 

 

ADA-wspolbiezn-26 

 
 

-- producent konsument rozwiązanie bledne 
with ada.text_io; 
use ada.text_io; 
 

procedure prodkons1 is 
 

  task bufor is 
 

entry wstaw(x : in Integer); 

 

entry wez(x : out Integer); 

  end bufor; 
 
  task body bufor is 

    maxi: constant Integer := 2; 
 

buf : array(1..maxi) of Integer; 

 

idx : Integer := 0; -- pol ost. elementu 

 

begin 

 

  loop 

         accept wstaw(x : in Integer) do 

           idx := idx + 1; 
 

       buf(idx) := x; 

 

     end wstaw; 

 

     accept wez(x : out Integer) do 

 

 

   x := buf(idx); 

 

 

   idx := idx - 1; 

 

     end wez; 

 

  end loop; 

   end bufor; 
 
   task producent is 

   end producent; 
 

   task body producent is 
 

i : Integer := 0; 

 

begin 

 

  loop 

 

    i := i + 1; 

 

    bufor.wstaw(i); 

         delay 1.0; 
 

  end loop; 

  end producent; 

 
  task konsument is 
  end konsument; 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 13

 

 

ADA-wspolbiezn-26 

  task body konsument is 
 

i : Integer := 0; 

 

begin 

 

  loop 

 

    bufor.wez(i); 

        delay 1.0; 

 

  end loop; 

 

end konsument; 

 

begin 
   put_line("Start"); 
end prodkons1; 

Przyk

ład 2-3 Problem producenta konsumenta – rozwiązanie błędne 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 14

 

 

ADA-wspolbiezn-26 

 

2.2  Instrukcja 

select

 

W powy

ższym przykładzie serwer musi wykonywać instrukcje 

accept

 

w takiej kolejno

ści jak klient wywołuje jego wejścia, co jest w praktyce 

niemo

żliwe. Rozwiązaniem jest zastosowanie instrukcji 

select

 
 
Instrukcja 

select

  wyst

ępuje w następujących formach: 

1.  Oczekiwanie selektywne – wybranie do obs

ługi jednego z 

wywo

ływanych wejść 

2.  Terminowe wywo

łanie wejścia – przeterminowanie oczekiwania 

klienta na spotkanie po wywo

łaniu wejścia 

3.  Warunkowe wywo

łanie wejścia – wykonanie innych instrukcji, gdy nie 

jest mo

żliwe wywołanie wejścia 

4.  Asynchroniczna zmiana w

ątku sterowania – przerwanie wykonywania 

zadania po up

ływie pewnego czasu lub wywołaniu spotkania. 

 
Oczekiwanie selektywne 
Oczekiwanie selektywne umo

żliwia: 

• 

oczekiwanie na wi

ęcej niż jedno spotkanie  

• 

oczekiwanie na rozpocz

ęcie spotkania  przez ustalony czas 

• 

wycofanie si

ę z oferty spotkania, jeżeli nie może ono nastąpić 

natychmiast, 

• 

zako

ńczenie zadania jeżeli nie istnieją klienci którzy wywołują jego 

wej

ścia. 

 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 15

 

 

ADA-wspolbiezn-26 

Instrukcja_oczekiwania_selektywnego ::= 

select  

  [

when

 wyra

żenie_logiczne  => ]   

 

-- dozór 

  

accept

  ident(parametry_formalne) 

do

      -- ga

łąź accept 

     instrukcje; 
  

end

 ident; 

  instrukcja   | instrukcja_delay [instrukcja {...}]   | 

terminate

 

or

 

  [

when

 wyra

żenie_logiczne  => ] -- dozór 

  

accept

  ident(parametry_formalne) 

do

      -- ga

łąź accept 

     instrukcje; 
  

end

 ident; 

  | instrukcja_delay [instrukcja {...}] } 
[

else

 instrukcja {...}]                      

 

-- ga

łąź else 

end select

 
 

2.3  Czekanie na wiele spotkań 
Zadanie bierne mo

że udostępniać wiele wejść.  

• 

Je

żeli w momencie wykonania 

select

 

żadne zadanie nie wywołuje 

wej

ścia to zadanie zawiesza się do momentu gdy wywołanie się 

pojawi. 

• 

Je

żeli w momencie wykonania 

select

 istnieja zadania wywo

łujące 

wej

ścia to jedno z nich zostanie wybrane. 

 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 16

 

 

ADA-wspolbiezn-26 

task serwer is 
  entry E1(...); 
  entry E2(...); 
end serwer 
 
task body serwer is 
... 
begin 
  loop 
    select 
       accept E1(...) do 
          ... 
       end E1; 

or 
  accept E2(...) do 

         ... 
      end E2; 

end select; 

  end loop; 
end serwer; 

Przyk

ład 2-4 Oczekiwanie alternatywne w instrukcji 

select 

 
Pojedyncze rozga

łęzienie instrukcji 

select

 mo

że zawierać: 

1.  Instrukcji obs

ługi wejścia 

accept

 i ewentualnie instrukcji 

wyst

ępujących po 

accept

2.  Sekwencj

ę instrukcji poprzedzoną instrukcją opóźnienia 

delay

 lub 

delay

 

until

3.  Instrukcj

ę 

terminate

 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 17

 

 

ADA-wspolbiezn-26 

2.4  Gałęzie dozorowane 
W ka

żdej gałęźi może być obecne wyrażenie logiczne nazywane 

dozorem.  
 
Instrukcja 

select

 rozpoczyna si

ę od obliczenia dozorów.  

• 

Ga

łęzie dla których wartość wyrażenia będzie true nazywamy 

otwartymi, b

ędą one wzięte pod uwagę.   

• 

Ga

łęzie dla których wartości dozorów mają wartość false nazywa się 

zamkni

ętymi i będą one pominiete. 

 
task serwer is 
  entry E1(...); 
  entry E2(...); 
end serwer 
 
task body serwer is 
... 
begin 
  loop 
     select 
       when wyrażenie1 => 
       accept E1(...) do 
          ... 
       end E1; 

or 
  accept E2(...) do 

         ... 
      end E2; 

end select; 

  end loop; 
end serwer; 

Przyk

ład 2-5 Oczekiwanie alternatywne w instrukcji 

select 

 
Dzia

łanie warunku w instrukcji 

select

• 

Gdy 

wyrażenie1 przyjmuje wartość 

true

, dane wej

ście jest 

uwzgl

ędniane w instrukcji 

select

.  

• 

Gdy 

wyrażenie1 przyjmuje wartość 

false

, dane wej

ście jest 

pomijane. 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 18

 

 

ADA-wspolbiezn-26 

 
-- producent konsument – rozw. poprawne 
-- plik prodkons2.adb 

with ada.text_io; 
use ada.text_io; 
 

procedure prodkons2 is 
 
   task bufor is 

 

entry wstaw(x : in Integer); 

 

entry wez(x : out Integer); 

   end bufor; 

 
   task body bufor is 

       maxi: constant Integer := 2; 
       --bufor na elementy 
 

   buf : array(1..maxi) of Integer; 

       -- polozenie ostatniego elementu 
 

   idx : Integer := 0; 

 

begin 

 

  loop 

         select  
       

when (idx < maxi + 1 ) =>  

        accept wstaw(x : in Integer) do 

 

 

      idx := idx + 1; 

 

 

      buf(idx) := x; 

 

 

    end wstaw; 

 

 

or 

 

 

when (idx >= 1) =>  

            accept wez(x : out Integer) do 
 

 

      x := buf(idx); 

 

 

      idx := idx - 1; 

 

 

    end wez; 

 

 

or 

 

 

  delay 1.0; -- czekam 

 

    end select; 

 

  end loop; 

 

end bufor; 

 

 
    task producent is 
    end producent; 

 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 19

 

 

ADA-wspolbiezn-26 

 

task body producent is 

     i : Integer := 0; 
 

begin 

 

  loop 

 

    i := i + 1; 

 

    bufor.wstaw(i); 

 

    put_line("PROD - do bufora " &  

                 Integer'Image(i)); 
 

    delay 1.0; 

 

  end loop; 

 

end producent; 

 

 

task konsument is 

 

end konsument; 

 
 

task body konsument is 

     i : Integer := 0; 

 

begin 

 

  loop 

 

   bufor.wez(i); 

        put_line("KONS - z bufora " &  
                  Integer'Image(i)); 
        delay 1.0; 

 

  end loop; 

 

end konsument; 

 
begin 
   put_line("Start"); 

end prodkons2; 
 

Przyk

ład 2-6 Problem producenta / konsumenta rozwiązanie poprawne 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 20

 

 

ADA-wspolbiezn-26 

2.5  Przeterminowanie spotkań 
Gdy serwer nie mo

że czekać bez końca na wywołanie wyjścia może 

wprowadzi

ć przeterminowanie.  

 
Do dyspozycji jest przeterminowanie: 

• 

wzgl

ędne 

 

delay

 opó

źnienie 

• 

bezwzgl

ędne   

delay until

 opó

źnienie 

 
Dzia

łanie przeterminowania: 

Gdy w ustalonym czasie 

żadne zadanie nie wywoła wejścia, następuje 

wyj

ście z instrukcji 

select

 
 

task serwer is 
  entry E1(...); 
end serwer 
 
task body serwer is 
... 
begin 
  loop 

select 

       accept E1(...) do 
       ... 
       end E1; 

or 
   delay 5.0    -- opóźnienie 5 sekund 
end select; 

  end loop; 
end serwer; 

Przyk

ład 2-7 Przeterminowanie oferty spotkania w zadaniu przyjmującym 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 21

 

 

ADA-wspolbiezn-26 

 
 
-- Przesylanie komunikatow jak w QNX 
with ada.text_io; 
use ada.text_io; 
 

procedure komunikaty2 is 
 
  task odbiorca is 

 

entry SendRec(x : in Integer; y: out Integer); 

  end odbiorca; 
 

  task body odbiorca is 
      idx : Integer := 0;  

   begin 
      loop 
         select 

           accept SendRec(x : in Integer; y : out Integer ) do 
               put_line("Odbior accept:" & Integer'Image(x)); 
               idx := idx + 1; 

               y := idx;  
           end SendRec; 
         or  

            delay 1.0; 
            put_line("Odbiorca - timeout:"); 

         end select; 
            
      end loop; 

   end odbiorca; 
 
   task producent is 

   end producent; 
 
   task body producent is 

 

i,j : Integer := 0; 

 

begin 

 

  loop 

         i := i + 1; 
         put_line("Producent - wyslalem " & Integer'Image(i)); 

         odbiorca.SendRec(i,j); 
         put_line("Producent – odebr." & Integer'Image(j)); 
         delay 2.0; 

 

  end loop; 

  end producent; 
   

begin 
   put_line("Start- komunikaty2"); 
end komunikaty2; 

Przyk

ład 2-8 Przykład przeterminowania odbierania komunikatów 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 22

 

 

ADA-wspolbiezn-26 

 

2.6  Gałąź else 
Ga

łąź 

else

 pozwala serwerowi wycofać ofertę spotkania, gdy brak jest 

zada

ń-klientów już oczekujących na spotkanie. Gałąź 

else

 może 

wyst

ąpić instrukcji 

select

 tylko raz i nie może być chroniona dozorem. 

 

 

task body Z is 
begin 
loop 
  select 
   accept We1(...) do 
   ... 
   end; 
  else 
    -- exit; -- zakoncz zadanie 
   null; -- wyjscie z intrukcji select 
  end select; 
end loop; 

Przyk

ład 2-9 Gałąź 

else

 w instrukcji 

select

 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 23

 

 

ADA-wspolbiezn-26 

-- Przesylanie komunikatow jak w QNX - przeterminowanie 
with ada.text_io; 
use ada.text_io; 

 
procedure komunikaty3 is 
 

  task odbiorca is 
 

entry SendRec(x : in Integer; y: out Integer); 

  end odbiorca; 

 
  task body odbiorca is 
      idx,krok : Integer := 0;  

   begin 
      loop 

         select 
           accept SendRec(x : in Integer; y : out Integer ) do 
               put_line("Odbior-accept:" & Integer'Image(x)); 

               idx := idx + 1; 
               y := idx;  
            end SendRec; 

         else    
            null; 
         end select; 

         krok := krok+1; 
         put_line("timeout:"& Integer'Image(krok)); 

         delay 1.0; 
      end loop; 
   end odbiorca; 

 
   task producent is 
   end producent; 

 
   task body nadawca is 
 

i,j : Integer := 0; 

 

begin 

 

  loop 

         i := i + 1; 

         put_line("Prod - wyslalem " &    
         Integer'Image(i)); 

         odbiorca.SendRec(i,j); 
         put_line("Prod - odebralem " & Integer'Image(j)); 
         delay 2.0; 

 

  end loop; 

  end nadawca; 
   

begin 
   put_line("Start- komunikaty3"); 
end komunikaty3; 

Przyk

ład 2-10 Użycie gałęzi 

else

 w instrukcji 

select

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 24

 

 

ADA-wspolbiezn-26 

 

2.7  Przeterminowanie wywołania wejścia 
Instrukcj

ę 

select

 umieszcza

ć można nie tylko po stronie serwera ale i 

klienta.  
 
Po stronie klienta instrukcja 

select

 s

łuży do: 

• 

Terminowego wywo

łania wejścia  (z przeterminowaniem) 

• 

Warunkowego wywo

łania wejścia 

 
 
Terminowe wywo

łanie wejścia  z umożliwia wycofanie oferty spotkania 

przez stron

ę wywołującą, gdy nie może ono zajść w określonym czasie. 

Do realizacji takiego przeterminowania wykorzystuje si

ę 

select

 
Terminowe_wywo

łanie_wejścia := 

select 

   Wywo

łanie_wejścia 

   [instrukcje1] 

else 

 

delay [until]

 opó

źnienie;  

  [instrukcje2] 

end select

 
 
Dzia

łanie terminowego wywołania wejścia:   

• 

Je

żeli w czasie określonym po 

delay

 nast

ąpi spotkanie to wykonana 

b

ędzie sekwencja instrukcje1. 

• 

Je

żeli w czasie określonym po 

delay

 spotkanie nie nast

ąpi to 

wykonana b

ędzie sekwencja instrukcje2. 

 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 25

 

 

ADA-wspolbiezn-26 

-- Przesylanie komunikatow - ograniczone czekanie nadawcy 
with ada.text_io; use ada.text_io; 
 

procedure komunikaty4 is 
  task odbiorca is 
 

entry Send(x : in Integer; y: out Integer); 

  end odbiorca; 
  task body odbiorca is 
   

idx : Integer := 0; -- pol ost. elementu 

 

begin 

 

  loop 

          accept Send(x : in Integer; y : out Integer ) do 

            put_line("Accept:" & Integer'Image(x)); 
            idx := idx + 1; 

            y := idx; 
            delay 2.0; 
          end Send; 

        end loop; 
   end odbiorca; 
 

   task nadawca is end nadawca; 
   task body nadawca is 
 

i,j : Integer := 0; 

 

begin 

 

  loop 

             i := i + 1; 
             select  
               odbiorca.Send(i,j); 

               put_line("Nad. odebralem " & Integer'Image(j)); 
             else 
               delay 1.0; 

               put_line("Nad. timeout" & Integer'Image(j)); 
             end select; 
 

  end loop; 

  end nadawca; 
 
begin 

   put_line("Start- komunikaty4"); 
end komunikaty4; 

Przyk

ład 2-11 Ograniczone czekanie po stronie wywołującej 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 26

 

 

ADA-wspolbiezn-26 

2.8  Warunkowe wywołanie wejścia 
Warunkowe wywo

łanie wejścia umożliwia wycofanie oferty spotkania 

przez stron

ę wywołującą, gdy nie może ono zajść natychmiast.  

 
 
Warunkowe_wywo

łanie_wejścia := 

select 

   Wywo

łanie_wejścia 

   [instrukcje1] 

else 

  [instrukcje2] 

end select

 
 
Dzia

łanie warunkowego wywołania wejścia:   

• 

Je

żeli spotkanie jest w danym momencie możliwe to wykonana 

b

ędzie sekwencja instrukcje1. 

• 

Je

żeli natychmiastowe spotkanie nie jest możliwe  to wykonana 

b

ędzie sekwencja instrukcje2. 

 
  select  
      odbiorca.Send(i,j); 
  else 
      put_line("Wysłanie teraz niemożliwe”); 
  end select; 
 
 
 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 27

 

 

ADA-wspolbiezn-26 

2.9  Gałąź terminate 
Istnieje mo

żliwość zakończenia zadania serwera, gdy nie ma klientów, 

którzy chcieliby z tego zadania korzysta

ć. Temu celowi służy gałąź 

terminate

 

• 

Ga

łąź 

terminate

 wybierana jest gdy jednostka macierzysta i 

wszystkie zadania potomne si

ę zakończyły. 

• 

Ga

łąź 

terminate

 mo

że być poprzedzona dozorem. Nie może 

wyst

ępować jednocześnie z gałęzią 

delay

 lub 

else

 
 

task body serwer is 
begin 
 loop 
  select 
   accept We1(...) do 
   ... 
   end; 
  or 
   terminate –- zakonczenie serwera 
  end select; 
 end loop; 
end serwer; 

Przyk

ład 2-12 Użycie instrukcji 

terminate

 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 28

 

 

ADA-wspolbiezn-26 

2.10  Asynchroniczna zmiana wątku sterowania 
Jest to forma instrukcji 

select

 nazywana ATC (ang. 

Asynchronous 

Transfer of Control). Składa się z części przerywającej i części 
przerywanej.  
 
Funkcj

ą tej instrukcji jest umożliwienie kontroli czasu wykonania się 

cz

ęści przerywanej poprzez: 

• 

wywo

łanie wejścia  

• 

up

ływ czasu 

 

Zmiana_w

ątku_sterowania := 

select 

  Wywo

łanie_wejścia | instrukcja_opóźnienia  

  [instrukcja1]  

then abort 

  instrukcja_przerywana 

end select

 
 
Po rozpocz

ęciu działania instrukcji 

select

 nast

ępuje wejście do części 

przerywanej. Cz

ęść ta może być przerwana, gdy nastąpi jej przerwanie 

poprzez wykonanie akcji okre

ślonej przez instrukcję wyzwalającą. 

Instrukcj

ą wyzwalającą może być  

• 

instrukcja 

delay

 [

until

],  

• 

Zako

ńczenie wywołania wejścia  

 
Je

żeli instrukcja przerywana zakończy się przed tym niż zajdzie 

zdarzenie przerywaj

ące to wykonywana jest instrukcja1. 

-- ustalanie limitu czasu wykonania 
with ada.text_io;use ada.text_io; 
 
procedure limit_czasu1 is 
  task odbiorca is 
  end odbiorca; 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 29

 

 

ADA-wspolbiezn-26 

  task body odbiorca is 

      i: Integer := 0; 
   begin 
      loop 
         select 
           delay 5.0; 
         then abort 
            loop -- czas wykonania odc. ograniczony 
               i := i+1; 
               delay 1.0; 
            end loop; 
         end select; 
         put_line("Wynik " & Integer'Image(i)); 
      end loop; 
   end odbiorca; 
 
begin 
   put_line("Start- limit_czasu1"); 
end limit_czasu1;

 

Przyk

ład 2-13 Przerywanie sekwencji instrukcji poprzez upływ czasu 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 30

 

 

ADA-wspolbiezn-26 

2.11  Przykład – semafor liczący 
 

-- Implementacja semafora liczącego za pomocą wejść 
with ada.text_io; 

use ada.text_io; 
 
procedure semafor3 is 

 
   task semafor is 
      entry sem_init(val:in Integer); 

      entry sem_wait; 
      entry sem_post; 
  end semafor; 

 
  task body semafor is 

    count : Integer := 1; -- poczatku 1 jedn. zasobu 
    begin 
     loop  

       select 
          accept sem_init(val:in Integer) do 
            count := val; 

          end sem_init;   
       or     
 

     when count > 0 => accept sem_wait do 

            count :=count - 1; --pobierz zasób 
            put_line("sem_wait:" & Integer'Image(count)); 

          end sem_wait; 
       or 
 

     accept sem_post do 

            count := count + 1;  
            put_line("sem_post:" & Integer'Image(count)); 
          end sem_post; 

 

  end select; 

     end loop; 
  end semafor; 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 31

 

 

ADA-wspolbiezn-26 

  task proces1 is 

  end proces1; 

 
  task body proces1 is 
  begin 

 

loop 

 

  semafor.sem_wait; 

 

  put_line("proces1: w sekcji"); 

 

  delay 1.0; 

 

  semafor.sem_post; 

 

end loop; 

  end proces1; 
 
  task proces2 is 

  end proces2; 
 

  task body proces2 is 
    begin 
     loop 

 

  semafor.sem_wait; 

       put_line("proces2: w sekcji"); 
       delay 3.0; 

 

  semafor.sem_post; 

     end loop; 
  end proces2; 

 
begin 
  put_line("main: start"); 

end semafor3; 

Przyk

ład 2-14 Semafor liczący

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 32

 

 

ADA-wspolbiezn-26 

 

3. Obiekty chronione 

3.1  Zmienne dzielone 
W j

ęzyku Ada83 synchronizowany dostęp do zmiennych dzielonych typu 

skalarnego zapewnia 

pragma shared

 
pragma Shared 

(Nazwa_zmiennej_globalnej) 

 

• 

Ka

żde przypisanie do zmiennej dzielonej powoduje aktualizację 

wszystkich jej kopii. 

• 

Zapewnione jest wzajemne wykluczanie zada

ń czytania oraz czytania 

i pisania (jak w problemie czytelników i pisarzy). 

 
Dzia

ła tylko dla typów skalarnych. 

 
W j

ęzyku Ada95 synchronizowany dostęp do zmiennych dzielonych 

zapewniony jest przez pragm

ę: 

 
Pragma_zmiennej_dzielonej ::= 

pragma 

Nazwa_pragmy(Nazwa_zmiennej) 

 
Nazwa_pragmy ::= 

Volatil [_Components] | 

             Atomic [_Components] 

 

• 

Gdy nie ma sk

ładnika pragmy  

Components

 odnosi si

ę ona do 

zmiennych dowolnego typu. 

• 

Gdy wyst

ępuje składnik 

Components

 odnosi si

ę ona do wszystkich 

elementów typu z

łożonego (tablicy lub rekordu) 

 
Pragma 

Volatil

  - kompilator nie umieszcza kopii zmiennej w 

rejestrach lub pami

ęci. 

 
Pragma 

Atomic

  - Operacje odczytu i zapisu s

ą traktowane jako 

niepodzielne. Zapewnione wzajemne wykluczanie typu czytelnicy i 
pisarze. 
 
Pragmy te nie s

ą obowiązkową częścią języka (opisane są w Aneksie). 

 

type

 buf_t 

is

 array(1..maxi) 

of

 Integer; 

pragma

 

Atomic_Components 

(buf_t) 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 33

 

 

ADA-wspolbiezn-26 

 

3.2  Synchronizacja dostępu do zmiennych dzielonych poprzez 
obiekt chroniony 
Obiekt chroniony jest jednostk

ą programową, która organizuje dostęp 

zada

ń do zawartych w obiekcie danych dzielonych (ang. shared 

variables). Obiekty chronione zapewniają możliwość komunikacji 
asynchronicznej pomi

ędzy zadaniami. Zapewniają spełnienie warunku 

wzajemnego wykluczania. 
 
Zapis obiektu chronionego podobny jest do zapisu zadania. Sk

łada się z 

specyfikacji i tre

ści.  

 
Specyfikacja obiektu chronionego zawiera cz

ęść publiczną i prywatną. 

• 

Cz

ęść publiczna (poprzedzona słowem 

protected

) zawiera: 

deklaracje wej

ść, funkcji, procedur. 

• 

Cz

ęść prywatna (poprzedzona słowem 

private

 ) zawiera: 

deklaracje zmiennych dzielonych i opcjonalnie deklaracje 
wewn

ętrznych wejść, funkcji, procedur. 

• 

Dost

ęp do obiektu chronionego możliwy jest tylko poprzez 

wywo

łanie funkcji, procedur i wejść publicznych. Odbywa się on na 

zasadzie wzajemnego wykluczania. 

• 

Wywo

łanie funkcji pozwala na odczyt danych współdzielonych (z 

cz

ęści 

private

) a wywo

łanie wejść i procedur na ich odczyt i 

zapis. 

 
Deklaracja_typu_obiektu_chronionego := 

protected

 

type

 Nazwa_typu_chronionego [Wyró

żnik] 

is

 

 { Specyfikacja_Podrogramu | Deklaracja_Wej

ścia } 

private

 

{ Specyfikacja_Podrogramu | Deklaracja_Wej

ścia | Deklaracja_danych } ] 

end

 [Nazwa_typu_chronionego] 

 
Deklaracja_Wej

ścia :=  

entry

 Identyfikator_Wej

ścia[(Podtyp_Indeksu)] (Lista_Parametrów); 

 
Specyfikacja typu chronionego 
 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 34

 

 

ADA-wspolbiezn-26 

Tre

ść_obiektu_chronionego := 

protected

 

body

 Nazwa_typu_chronionego  

is

 

 { Specyfikacja_Podrogramu | Tre

ść_Podprogramu | Treść_Wejścia } 

end

 [Nazwa_typu_chronionego] 

 
Tre

ść_Wejścia :=  

entry

  

   Identyfikator_Wej

ścia[(Deklaracja_Indeksu)] (Lista_Parametrów)] 

   

when

 Wyra

żenie_logiczne_dozoru  

is 

       Sekwencja_instrukcji_obs

ługi_wejścia 

end

 Identyfikator_Wej

ścia; 

 
Deklaracja_Indeksu := 

for

 Identyfikator_indeksu 

in

 Podtyp_indeksu 

 
Tre

ść typu chronionego 

 
 

protected

   Modul1 

is 

-- specyfikacja obiektu chronionego Modul1

  

 

  

entry

 We1(...);          -- wej

ście W1 z listą parametrów formalnych 

  

procedure

 Pr1(...);  -- procedura P1 z list

ą parametrów formalnych 

  

function

 Fun1(...);  -- funkcja Fun1 z list

ą parametrów formalnych 

  ... 

private 

  zmienna1: Typ1;  -- zmienna dzielona typu Typ1 
  zmienna2: Typ2;  -- zmienna dzielona typu Typ2 
  ... 

protected

 

body

 Modul1 

is 

-- tre

ść obiektu chronionego Mod

  

 

  

entry

 We1 

when

 warunek 

is 

– tre

ść wejścia We1 z barierą  

  begin 

      .... 
  

end

 We1; 

 

end

 Mod1; 

 

 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 35

 

 

ADA-wspolbiezn-26 

Synchronizacja dost

ępu do obiektu chronionego: 

• 

Dopuszczalne jest wspó

łbieżne wykonywanie funkcji obiektu 

chronionego. Funkcja umo

żliwia tylko odczyt danych dzielonych. 

Wykonanie funkcji odbywa si

ę na zasadzie wzajemnego wykluczania 

wzgl

ędem procedur i wejść. 

• 

Procedury obiektu chronionego wykonywane s

ą na zasadzie 

wzajemnego wykluczania wzgl

ędem funkcji i wejść. 

• 

Wej

ścia obiektu chronionego wykonywane są na zasadzie 

wzajemnego wykluczania wzgl

ędem funkcji i wejść. Wejścia 

dodatkowo chronione s

ą przez wyrażenie logiczne (bariera). 

Wykonane b

ędą gdy warunek przyjmie wartość 

true

. W przeciwnym 

przypadku zadanie wywo

łujące będzie zablokowane do czasu 

spe

łnienia warunku. 

 
Warunek bariery sprawdzany jest gdy: 

• 

Zadanie bie

żące wywołuje wejście dozorowane. 

• 

Inne zadanie wykonuje procedur

ę lub wywołuje wejście danego 

obiektu chronionego. Obliczenie warunku bariery nast

ępuje gdy 

ko

ńczy się procedura lub zadanie kończy wywołanie wejścia.  

 
Kolejki zada

ń oczekujących na barierach są kolejkami typu FIFO. 

 
Wniosek: 
Obiekt chroniony implementuje monitor. 
 
 
 
 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 36

 

 

ADA-wspolbiezn-26 

Obiekt chroniony

zadania oczekujące

na wejście do

obiektu

chronionego

Kolejka 1

Zadania

wstrzymane na

barierach

Wejścia

entry 1

entry 2

Kolejka 2

Zmienne

Procedury

Pk

P2

P1

Funkcje

Pk

P2

P1

bariera1

bariera2

 

Rysunek 3-1 Ilustracja obiektu chronionego 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 37

 

 

ADA-wspolbiezn-26 

 
-- Problem producenta konsumenta - obiekt chroniony 
with ada.text_io; 

use ada.text_io; 
 
procedure prodkons3 is 

     maxi: constant Integer := 8; 
 

type buf_t is array(1..maxi) of Integer; 

 

 

protected bufcykl is 

 

   entry wstaw(element : in Integer); 

 

   entry wez(element : out Integer); 

 

   private 

 

      idx : Integer := 0; 

           buf : buf_t; 
 

end bufcykl; 

 

 

protected body bufcykl is 

 

   entry wstaw(element: in Integer) when (idx+1)<maxi+1 is 

 

   begin 

 

 

idx := idx + 1; 

 

 

buf(idx) := element; 

 

   end wstaw; 

 
 

   entry wez(element : out Integer) when (idx-1)>0 is 

 

   begin 

 

 

element := buf(idx); 

 

 

idx := idx - 1; 

 

   end wez; 

 

end; 

 

 

task producent is 

 

end; 

 

 

task body producent is 

 

i : Integer := 0; 

 

begin 

 

  loop 

 

 

i := i + 1; 

 

 

bufcykl.wstaw(i); 

 

 

put_line("Prod-wstaw" & Integer'Image(i)); 

 

 

delay 0.7; 

 

  end loop; 

 

end; 

 

 

task konsument is 

 

end; 

 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 38

 

 

ADA-wspolbiezn-26 

 

task body konsument is 

 

i : Integer := 0; 

 

begin 

 

  loop 

 

     bufcykl.wez(i); 

          put_line("Kons-wez" & Integer'Image(i)); 
          delay 1.0; 
 

  end loop; 

 

end; 

begin 
  put_line("Start - prodkons3"); 

end prodkons3; 

Przyk

ład rozwiązania problemu producenta – konsumenta z obiektem 

chronionym 
 
Gdy zadanie musi by

ć obsługiwane w dwóch częściach stosuje się 

instrukcj

ę 

requeue

 
 
Instrukcja_requeue := 

requeue

 Nazwa_wej

ścia [

with abort

 
 
Instrucja powoduje ponowne umieszczenie zadania w kolejce do 
wyspecyfikowanego wej

ścia. Instrukcja powinna być umieszczona jako 

ostatnia w bloku obs

ługi wejścia. 

 
Gdy zadanie przebywa wewn

ątrz obiektu chronionego to dostęp innych 

zada

ń do tego obiektu na ten czas może być zablokowany. W związku z 

tym zadanie powinno przebywa

ć w obiekcie chronionym jak najkrócej. W 

zwi

ązku z tym wykonywanie pewnych instrukcji w obiekcie chronionym 

jest zabronione. 
 
Instrukcje zabronione w obiekcie chronionym: 

select 
accept 

wywo

łanie wejścia 

delay, delay until 

tworzenie lub aktywacja zadania 
wywo

łanie podprogramu wewnątrz którego znajdują się operacje 

potencjalnie blokuj

ące. 

 
U

życie powyższych operacji w obiekcie chronionym powoduje 

zg

łoszenie wyjątku. 

PDF created with pdfFactory trial version 

www.pdffactory.com

background image

Wspó

łbieżność w języku Ada 

                                              

 39

 

 

ADA-wspolbiezn-26 

3.3  Stany zadania w języku Ada 
 

non-existing

created

terminated

finalising

completed

activating

running

wait for protected

entry call

wait on

entry call

wait on

accept

wait on

select

wait on

rendezvous

end

delayed

 

Rysunek 0-1 Wa

żniejsze stany zadania w języku Ada 

 
 

4. Źródła 

[1]  Z. Huzar, Z. Fry

źlewicz, I. Dubielewicz, ADA 95, wyd. Helion 

     1998. 
[2] Gilles Motet, Tomasz Szmuc, Programowanie systemów  
     czasu rzeczywistego z zastosowaniem j

ęzyka ADA, AGH 

     uczelniane wydawnictwo naukowo dydaktyczne, Kraków 2002. 
[3] Pyle I. C. Ada, Warszawa WNT 1986. 
[4] Richard Riehle, Ada Distilled,  An Introduction to Ada  
     Programming  for Experienced Computer Programmers 
     

http://www.adaic.org/docs/distilled/adadistilled.pdf

 

PDF created with pdfFactory trial version 

www.pdffactory.com