Program pokazujący rozwiązanie synchronizacji dostępu do sekcji krytycznej poprzez mechanizm spotkań w języku ADA.
Plik projektowy ze środowiska GNAT Studio | Adacore.
Problem wzajemnego wykluczania występuje wtedy kiedy conajmniej dwa procesy, chcą skorzystać z zasobu współdzielonego. Muszą one jednak skorzystać z niego jeden po drugim, aby nie "wtrącać się" jeden drugiemu. Dostęp do takiego zasobu współdzielonego nazywa się sekcją krytyczną procesu. W naszym przypadku zasobem współdzielonym jest ekran konsoli.
Ćwiczenie 3 - Utworzyć 2 zadania tego samego typu zadaniowego wypisujące na ekranie w 2 kolumnach po 10 razy: "Zadanie nr po raz k" gdzie k- aktualna iteracja, nr - numer zadania. Wprowadzić przerwy pomiędzy interacjami o losowej długości. Do synchronizacji użyj mechanizmu spotkań.
Program swoją sekcję lokalną symuluje poprzez wykonanie opóźnienia delay
o losowym czasie trwania. W sekcji krytycznej program jest dopuszczany do wykonania wypisania na ekranie. W przypadku niezastosowania synchronizacji dostępu do ekranu konsoli, możemy otrzymać wypisane ciągi procesu P1 wraz z ciągiem procesu P2.
Mechanizm spotkań w języku ADA polega na odwoływaniu się przez procesy (task) do procesu biernego, który kolejno oczekuje wywołania wejść. W przypadku tego zadania wykorzystano jako proces bierny następujące zadanie:
task Serwer is
entry Zajmij;
entry Zwolnij;
end Serwer;
task body Serwer is
begin
loop
accept Zajmij;
accept Zwolnij;
end loop;
end Serwer;
Proces poprzez wejście w nieskończoną pętlę, oczekuje najpierw wejścia Zajmij
a następnie Zwolnij
. W przypadku kiedy jakiś 'proces1' wywoła wejście Zajmij
podczas gdy inny 'proces2' wykonał już to wywołanie, to 'proces1' zostanie wstrzymany do momentu wywołania przez inny proces wejścia Zwolnij
.
Moment krytyczny zadania:
Serwer.Zajmij;
-- sekcja krytyczna BEG
Set_Col(Positive_Count(kolumna));
wyswietl(i,nr_zadania);
-- sekcja krytyczna END
Serwer.Zwolnij;
Dowiedz się więcej o mechaniźmie spotkać w Adzie -> Spotkania (randki) w Adzie
Zobacz też inne rozwiązanie tego zadania -> Algorytm Dekkera <- algorytmen Dekkera !
Zadanie 2 po raz 1
Zadanie 1 po raz 1
Zadanie 1 po raz 2 Zadanie 2 po raz 2
Zadanie 1 po raz 3
Zadanie 1 po raz 4 Zadanie 2 po raz 3
Zadanie 2 po raz 4
Zadanie 2 po raz 5
Zadanie 1 po raz 5 Zadanie 2 po raz 6
Zadanie 1 po raz 6 Zadanie 2 po raz 7
Zadanie 2 po raz 8
Zadanie 1 po raz 7 Zadanie 2 po raz 9
Zadanie 1 po raz 8 Zadanie 2 po raz 10
Zadanie 1 po raz 9
Zadanie 1 po raz 10
Zadanie 1 po raz 1
Zadanie 1 po raz 2Zadanie 2 po raz
1Zadanie 1 po raz Zadanie 3 2 po raz
2Zadanie 1 po raz 4 Zadanie
2Zadanie po raz 1 3 po raz Zadanie 5 2 po raz
4Zadanie 1 po raz 6 Zadanie 2 po raz 5
Zadanie Zadanie 1 2 po raz po raz 7 6
Zadanie 1 po raz 8 Zadanie 2 po raz 7
Zadanie Zadanie 2 po raz 8 1
po raz Zadanie 9 2 po raz 9
Zadanie 2 po raz 10Zadanie 1 po raz 10
lokalizajca:
src/main.adb - plik główny main
src/RandomPackage.ads - pakiet RandomPackage
src/RandomPackage.adb - pakiet RandomPackage - ciało
© Jakub Grątkiewicz