SPRAWOZDANIE Z ZADANIA ZALICZENIOWEGO Z LABORATORIUM PROGRAMOWANIA WSPÓŁBIEŻNEGO
TEMAT:
„PĘTLA AUTOBUSOWA WAT”
PRACĘ WYKONAŁ
ZAŁOŻENIA:
Problem polega na symulacji jazdy autobusów w pobliżu pętli autobusowej Stare Bemowo. Zadaniem jest takie kierowanie ruchem, aby nie dochodziło do zderzeń i najeżdżania na siebie autobusów.
Autobusy wymagają synchronizacji w trzech punktach:
-skrzyżowanie Kaliskiego z wjazdem na pętle,
-skrzyżowanie Radiowej z Ebro i wyjazdem z pętli,
-pętli samej w sobie.
Ze względu na przejrzystość prezentacji dokonano modyfikacji kształtu ulic otaczających pętle, w szczególności zaś zrównano ze sobą wyjazd z pętli i ulicę Ebro (skrzyżowanie ze światłami), co nie miało zasadniczego wpływu na zachowanie autobusów. Kwestie rozpatrywano dla pięciu linii autobusowych:
-Kaliskiego-Radiowa (np. linia 105),
-Radiowa-Kaliskiego (np. linia 310),
-Kaliskiego ze zjazdem na pętle (np. linia 109),
-Radiowa ze zjazdem na pętle (np. linia 523),
-linia nocna (601).
Ze względu na i tak dużą złożoność obliczeniową pominięto zagwarantowanie bezpieczeństwa autobusów poza miejscami synchronizacji, ograniczając się jedynie do uniemożliwienia całkowitego pokrywania się (wyprzedzania) autobusów (są tam skrzyżowania i podwójna ciągła linia).
W rozwiązaniu z semaforami przyjęto, że każde skrzyżowanie jest podzielone na cztery sekcje (od 1 do 4 licząc wierszami od lewej), dodatkowo na skrzyżowaniu Kaliskiego dołożono semafor ograniczający możliwość skrętu w lewo autobusom nadjeżdżającym od strony skrzyżowania z Radiową. Pętla jest chroniona semaforami wjazdu i wyjazdu.
W drugim rozwiązaniu każde skrzyżowanie podzielono na dwa pasy: prawy i lewy. Każdy z tych pasów jest zadaniem udostępniającym wejścia autobusom nadjeżdżającym z obu stron. W zależności od pasa wyróżniamy:
-wejście będące prostym przejazdem przez skrzyżowanie,
-wejście będące skrętem na skrzyżowaniu,
-wejście umożliwiające przecięcie danego pasa.
Do synchronizacji wykorzystywane są także dwa zadania:
-światła - symulujące sygnalizację świetlną na skrzyżowaniu Radiowa-Ebro,
-doba - symulująca zmianę pory dnia, co ogranicza poruszanie się autobusów zwykłych autobusu linii nocnej.
WYKAZ ZASOBÓW WSPÓŁDZIELONYCH:
W rozwiązaniu z semaforami wyróżnia się:
1. Ekran, co wynika z treści założeń zadania.
2. Cztery pola na skrzyżowaniu ulicy Kaliskiego z wjazdem na pętle.
3. Cztery pola na skrzyżowaniu ulicy Radiowej z wyjazdem z pętli.
4. Pętla, a dokładniej zadeklarowana na początku ilość postojów na niej (od jednego do czterech ze względu na wielkość ekranu) oraz wyjazd z i wjazd na nią.
5. Poszczególne pola ulic Kaliskiego i Radiowej.
W rozwiązaniu na spotkaniach wyróżnia się:
1. Ekran, co wynika z treści założeń zadania.
2. Dwa pasy na skrzyżowaniu ulicy Kaliskiego z wjazdem na pętle.
3. Dwa pasy na skrzyżowaniu ulicy Radiowej z wyjazdem z pętli.
4. Pętla, a dokładniej zadeklarowana na początku ilość postojów na niej (od jednego do czterech ze względu na wielkość ekranu) oraz wyjazd z i wjazd na nią.
5. Poszczególne pola ulic Kaliskiego i Radiowej.
WYKAZ SEKCJI KRYTYCZNYCH:
Wypisywanie na ekran pozycji lub czyszczenie starej pozycji na ekranie w polu nie objętym synchronizacją.
W wypadku rozwiązania na semaforach: wypisanie się na dowolnym polu należącym do dowolnego skrzyżowania.
W wypadku rozwiązania na spotkaniach: przejazd(wypisanie się na kolejnych polach) jednego z zadeklarowanych pasów.
Wypisanie się na dowolnym z pól pętli lub na wjeździe na lub wyjeździe z niej.
WYKAZ OBIEKTÓW SYNCHRONIZACJI:
W rozwiązaniu z semaforami
1. Osiem semaforów binarnych chroniących poszczególne pola obu skrzyżowań.
2. Jeden semafor chroniący wjazd na pętle.
3. Semafory chroniące wyjazd z pętli.
4. Zadania symulujące zmianę świateł i pór dnia.
W rozwiązaniu na spotkaniach
1. Cztery spotkania chroniące poszczególne pasy ruchu na skrzyżowaniach.
2. Zmienne chroniące wjazd i zjazd z pętli wykorzystywane przez w/w spotkania.
3. Zadania symulujące zmianę świateł i pór dnia.
WYKAZ PROCESÓW SEKWENCYJNYCH:
Procesy odpowiadające poszczególnym linią autobusowym należące do czterech typów będących trasami ich przejazdu:
-Kaliskiego-Radiowa,
-Radiowa-Kaliskiego,
-Kaliskiego ze zjazdem na pętle,
-Radiowa ze zjazdem na pętle,
-linia nocna.
2. Proces odpowiadający za zmianę pór dnia.
3. Proces odpowiedzialny za zmianę świateł na skrzyżowaniu Radiowa-Ebro.
4. W rozwiązaniu na spotkaniach dodatkowo występują procesy odpowiedzialne za
synchronizację poszczególnych pasów na skrzyżowaniach.
STANY PROCESÓW SEKWENCYJNYCH:
Autobusy mogą znajdować się w następujących stanach:
-oczekiwanie na wpuszczenie na dane pole dojazdu do lub odjazdu od obiektu synchronizacji,
-wypisywania lub czyszczenia swojej nazwy,
-oczekiwania na wpuszczenie na dane skrzyżowanie (lub jego pole),
-przejazdu przez skrzyżowanie,
-dla autobusów skręcających na pętle:
-oczekiwanie na wjazd na pętle,
-pobyt na pętli,
-oczekiwanie na zwolnienie się wyjazdu z pętli,
-oczekiwania na porę dnia, w której dany autobus jeździ.
Światła mogą znajdować się w stanach:
- sygnalizacji światła zielonego dla Radiowej,
- sygnalizacji światła zielonego dla Ebro.
Doba może, zasadniczo, znajdować się tylko w stanie oczekiwania na zakończenie odpowiedniej pory dnia i sygnalizacji tej zmiany.
W rozwiązaniu na spotkaniach zadania symulujące pasy są w nieskończonej pętli oczekiwania na autobusy deklarujące chęć przejazdu przez dane skrzyżowanie.
LISTING PROGRAMU:
Semafory:
with Sem83;
use Sem83;
with Winconsoleex;
use Winconsoleex;
with Procpom;
use Procpom;
procedure Watsem is
Swiat : Integer := 6;
Dzien : Boolean := True;
Miejsca_Na_Petli : Integer := 4;
Skretnapetle : Binary_Semaphore := Init (1);
Wyjazd : Binary_Semaphore := Init (0);
Wolny_Wyjazd : Binary_Semaphore := Init (1);
Wjazd : Semaphore := Init (Miejsca_Na_Petli);
Rysuj : Boolean := True;
Dlugosc_Dnia : Integer := 5000;
Dlugosc_Nocy : Integer := 5000;
N : Integer := 0;
Prawykal : array (1 .. 6) of Integer := (others => 1);
Lewykal : array (1 .. 6) of Integer := (others => 1);
Prawyrad : array (1 .. 6) of Integer := (others => 1);
Lewyrad : array (1 .. 6) of Integer := (others => 1);
Radkal : array (0 .. 37) of Integer := (others => 1);
Kalrad : array (0 .. 31) of Integer := (others => 1);
Skrzyzkal1,
Skrzyzkal2,
Skrzyzkal3,
Skrzyzkal4 : Binary_Semaphore := Init (1);
Skrzyzrad1,
Skrzyzrad2,
Skrzyzrad3,
Skrzyzrad4 : Binary_Semaphore := Init (1);
task Doba;
task type Autobus_Kaliskiegopetla(Nr,Skp, Okp: Integer);
task type Autobus_Radiowapetla(Nr, Srp, Orp: Integer);
task type Autobus_Kaliskiegoradiowa(Nr, Skr, Okr: Integer);
task type Autobus_Radiowakaliskiego(Nr, Srk, Ork: Integer);
task type Autobus_Nocny(Nr, On: Integer);
task Swiatla;
task body Doba is
Dlugoscdnia,
Dlugoscnocy : Duration;
begin
Dlugoscdnia:=Duration(Float(Dlugosc_Dnia)/100.0);
Dlugoscnocy:=Duration(Float(Dlugosc_Nocy)/100.0);
loop
if Dzien=True then
delay Dlugoscdnia;
Dzien:=False;
else
delay Dlugoscnocy;
Dzien:=True;
end if;
end loop;
end Doba;
task body Swiatla is
L : Integer := 0;
begin
loop
exit when Rysuj=False;
end loop;
loop
Swiatla1;
Skrzyzrad1:=Init(0);
Skrzyzrad4:=Init(0);
while L<Swiat loop
Signal(Wyjazd);
delay 0.5;
L:=L+1;
end loop;
L:=0;
Swiatla2;
Wyjazd:=Init(0);
while L<Swiat loop
Signal(Skrzyzrad1);
Signal(Skrzyzrad4);
delay 0.5;
L:=L+1;
end loop;
L:=0;
end loop;
end Swiatla;
procedure Napetli (
Nra : Integer ) is
K : Integer;
begin
K:=N;
Pisz(Nra,12+3*N,35);
N:=(N+1) mod Miejsca_Na_Petli;
delay 2.0;
Wait(Wolny_Wyjazd);
Wait(Wyjazd);
Signal(Wjazd);
Czysc(12+3*K,35);
end Napetli;
procedure Kaliskiegolewy (
Nra : Integer ) is
begin
for Z in 2..6 loop
loop
if Lewykal(Z)=1 then
exit;
end if;
end loop;
Czysc((17+Z),21);
Pisz(Nra,(18+Z),21);
Lewykal(Z-1):=1;
delay 0.2;
end loop;
Czysc(24,21);
Lewykal(6):=1;
end Kaliskiegolewy;
procedure Radiowalewy (
Nra : Integer ) is
begin
for Z in 2..6 loop
loop
if Lewyrad(Z)=1 then
Lewyrad(Z):=0;
exit;
end if;
end loop;
Czysc((17+Z),46);
Pisz(Nra,(18+Z),46);
Lewyrad(Z-1):=1;
delay 0.2;
end loop;
Czysc(24,46);
Lewyrad(6):=1;
end Radiowalewy;
procedure Radiowaprawy (
Nra : Integer ) is
begin
loop
if Prawyrad(1)=1 then
Prawyrad(1):=0;
exit;
end if;
end loop;
Pisz(Nra,24,49);
delay 0.2;
for Z in 2..6 loop
loop
if Prawyrad(Z)=1 then
Prawyrad(Z):=0;
exit;
end if;
end loop;
Czysc((26-Z),49);
Pisz(Nra,(25-Z),49);
Prawyrad(Z-1):=1;
delay 0.2;
end loop;
end Radiowaprawy;
procedure Kaliskiegoprawy (
Nra : Integer ) is
begin
loop
if Prawykal(1)=1 then
Prawykal(1):=0;
exit;
end if;
end loop;
Pisz(Nra,24,24);
delay 0.2;
for Z in 2..6 loop
loop
if Prawykal(Z)=1 then
Prawykal(Z):=0;
exit;
end if;
end loop;
Czysc((26-Z),24);
Pisz(Nra,(25-Z),24);
Prawykal(Z-1):=1;
delay 0.2;
end loop;
end Kaliskiegoprawy;
procedure Radiowakaliskiego (
Nra : Integer ) is
begin
loop
if Radkal(1)=1 then
Radkal(1):=0;
exit;
end if;
end loop;
Czysc(16,49);
Pisz(Nra,15,49);
Radkal(0):=1;
delay 0.2;
for I in 2..5 loop
loop
if Radkal(I)=1 then
Radkal(I):=0;
exit;
end if;
end loop;
Czysc(17-I,49);
Pisz(Nra,16-I,49);
Radkal(I-1):=1;
delay 0.2;
end loop;
for I in 1..8 loop
loop
if Radkal(5+I)=1 then
Radkal(5+I):=0;
exit;
end if;
end loop;
Czysc(12-I,50-I);
Pisz(Nra,11-I,49-I);
Radkal(I+4):=1;
delay 0.2;
end loop;
for I in 1..11 loop
loop
if Radkal(13+I)=1 then
Radkal(13+I):=0;
exit;
end if;
end loop;
Czysc(3,42-I);
Pisz(Nra,3,41-I);
Radkal(I+12):=1;
delay 0.2;
end loop;
for I in 1..9 loop
loop
if Radkal(24+I)=1 then
Radkal(24+I):=0;
exit;
end if;
end loop;
Czysc(2+I,31-I);
Pisz(Nra,3+I,30-I);
Radkal(I+23):=1;
delay 0.2;
end loop;
for I in 1..4 loop
loop
if Radkal(33+I)=1 then
Radkal(33+I):=0;
exit;
end if;
end loop;
Czysc(11+I,21);
Pisz(Nra,12+I,21);
Radkal(I+32):=1;
delay 0.2;
end loop;
end Radiowakaliskiego;
procedure Kaliskiegoradiowa (
Nra : Integer ) is
begin
loop
if Kalrad(1)=1 then
Kalrad(1):=0;
exit;
end if;
end loop;
Czysc(16,24);
Pisz(Nra,15,24);
Kalrad(0):=1;
delay 0.2;
for I in 2..4 loop
loop
if Kalrad(I)=1 then
Kalrad(I):=0;
exit;
end if;
end loop;
Czysc(17-I,24);
Pisz(Nra,16-I,24);
Kalrad(I-1):=1;
delay 0.2;
end loop;
for I in 1..8 loop
loop
if Kalrad(4+I)=1 then
Kalrad(4+I):=0;
exit;
end if;
end loop;
Czysc(13-I,23+I);
Pisz(Nra,12-I,24+I);
Kalrad(I+3):=1;
delay 0.2;
end loop;
for I in 1..7 loop
loop
if Kalrad(12+I)=1 then
Kalrad(12+I):=0;
exit;
end if;
end loop;
Czysc(4,31+I);
Pisz(Nra,4,32+I);
Kalrad(I+11):=1;
delay 0.2;
end loop;
for I in 1..7 loop
loop
if Kalrad(19+I)=1 then
Kalrad(19+I):=0;
exit;
end if;
end loop;
Czysc(3+I,38+I);
Pisz(Nra,4+I,39+I);
Kalrad(I+18):=1;
delay 0.2;
end loop;
for I in 1..5 loop
loop
if Kalrad(26+I)=1 then
Kalrad(26+I):=0;
exit;
end if;
end loop;
Czysc(10+I,46);
Pisz(Nra,11+I,46);
Kalrad(I+25):=1;
delay 0.2;
end loop;
end Kaliskiegoradiowa;
--------------------------------------------AUTOBUS_NOCNY------------------------------------------------------------------
task body Autobus_Nocny is
K : Integer := 0;
Dn : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Dn:=Duration(Float(On)/100.0);
loop
while Dzien=False loop
Radiowaprawy(Nr);
Wait(Skrzyzrad4);
Czysc(19,49);
Pisz(Nr,18,49);
Prawyrad(6):=1;
delay 0.2;
Wait(Skrzyzrad2);
Czysc(18,49);
Pisz(Nr,17,49);
Signal(Skrzyzrad4);
delay 0.2;
loop
if Radkal(0)=1 then
Radkal(0):=0;
exit;
end if;
end loop;
Czysc(17,49);
Pisz(Nr,16,49);
Signal(Skrzyzrad2);
delay 0.2;
Radiowakaliskiego(Nr);
Wait(Skrzyzkal1);
Czysc(16,21);
Pisz(Nr,17,21);
Radkal(37):=1;
delay 0.2;
Wait(Skrzyzkal3);
Czysc(17,21);
Pisz(Nr,18,21);
Signal(Skrzyzkal1);
delay 0.2;
loop
if Lewykal(1)=1 then
Lewykal(1):=0;
exit;
end if;
end loop;
Czysc(18,21);
Pisz(Nr,19,21);
Signal(Skrzyzkal3);
delay 0.2;
Kaliskiegolewy(Nr);
delay Dn;
Kaliskiegoprawy(Nr);
Skretnapetle:=Init(0);
Wait(Skrzyzkal4);
Czysc(19,24);
Pisz(Nr,18,24);
Prawykal(6):=1;
delay 0.2;
Wait(Skrzyzkal2);
Czysc(18,24);
Pisz(Nr,17,24);
Signal(Skrzyzkal4);
delay 0.2;
loop
if Kalrad(0)=1 then
Kalrad(0):=0;
exit;
end if;
end loop;
Czysc(17,24);
Pisz(Nr,16,24);
Signal(Skrzyzkal2);
delay 0.2;
Kaliskiegoradiowa(Nr);
Wait(Skrzyzrad1);
Czysc(16,46);
Pisz(Nr,17,46);
Kalrad(31):=1;
delay 0.2;
Wait(Skrzyzrad3);
Czysc(17,46);
Pisz(Nr,18,46);
Signal(Skrzyzkal1);
Signal(Skretnapetle);
delay 0.2;
loop
if Lewyrad(1)=1 then
Lewyrad(1):=0;
exit;
end if;
end loop;
Czysc(18,46);
Pisz(Nr,19,46);
Signal(Skrzyzrad3);
delay 0.2;
Radiowalewy(Nr);
delay Dn;
end loop;
end loop;
end Autobus_Nocny;
------------------------------------------------KALISKIEGO-PETLA----------------------------------------------------
task body Autobus_Kaliskiegopetla is
Dkp : Duration;
Ckp : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Ckp:=Duration(Float(Okp)/100.0);
Dkp:=Duration(Float(Skp)/100.0);
delay Dkp;
loop
while Dzien=True loop
Kaliskiegoprawy(Nr);
Skretnapetle:=Init(0);
Wait(Skrzyzkal4);
Czysc(19,24);
Pisz(Nr,18,25);
Prawykal(6):=1;
delay 0.2;
Czysc(18,25);
Pisz(Nr,18,26);
delay 0.2;
Czysc(18,26);
Pisz(Nr,18,27);
delay 0.2;
Czysc(18,27);
Signal(Skrzyzkal4);
Signal(Skretnapetle);
Napetli(Nr);
Pisz(Nr,17,43);
delay 0.2;
Skrzyzrad2:=Init(0);
for Z in 43..48 loop
Czysc(17,Z);
Pisz(Nr,17,Z+1);
delay 0.2;
end loop;
Signal(Wolny_Wyjazd);
loop
if Radkal(0)=1 then
Radkal(0):=0;
exit;
end if;
end loop;
Czysc(17,49);
Pisz(Nr,16,49);
Signal(Skrzyzrad2);
delay 0.2;
Radiowakaliskiego(Nr);
Wait(Skrzyzkal1);
Czysc(16,21);
Pisz(Nr,17,21);
Radkal(37):=1;
delay 0.2;
Wait(Skrzyzkal3);
Czysc(17,21);
Pisz(Nr,18,21);
Signal(Skrzyzkal1);
delay 0.2;
loop
if Lewykal(1)=1 then
Lewykal(1):=0;
exit;
end if;
end loop;
Czysc(18,21);
Pisz(Nr,19,21);
Signal(Skrzyzkal3);
delay 0.2;
Kaliskiegolewy(Nr);
delay Ckp;
end loop;
end loop;
end Autobus_Kaliskiegopetla;
-----------------------------------------------------RADIOWA-PETLA-----------------------------------------------------
task body Autobus_Radiowapetla is
Drp : Duration;
Crp : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Drp:=Duration(Float(Srp)/100.0);
Crp:=Duration(Float(Srp)/100.0);
delay Drp;
loop
while Dzien=True loop
Radiowaprawy(Nr);
Wait(Skrzyzrad4);
Czysc(19,49);
Pisz(Nr,18,49);
Prawyrad(6):=1;
delay 0.2;
Wait(Skrzyzrad2);
Czysc(18,49);
Pisz(Nr,17,49);
Signal(Skrzyzrad4);
delay 0.2;
loop
if Radkal(0)=1 then
Radkal(0):=0;
exit;
end if;
end loop;
Czysc(17,49);
Pisz(Nr,16,49);
Signal(Skrzyzrad2);
delay 0.2;
Radiowakaliskiego(Nr);
Wait(Skrzyzkal1);
Wait(Skrzyzkal3);
Czysc(16,21);
Pisz(Nr,17,21);
Radkal(37):=1;
delay 0.2;
Wait(Skretnapetle);
Skrzyzkal4:=Init(0);
Czysc(17,21);
Pisz(Nr,18,22);
Signal(Skrzyzkal1);
delay 0.2;
Wait(Wjazd);
for T in 22..26 loop
Czysc(18,T);
Pisz(Nr,18,T+1);
delay 0.2;
end loop;
Czysc(18,27);
Signal(Skrzyzkal3);
Signal(Skrzyzkal4);
Signal(Skretnapetle);
Napetli(Nr);
Pisz(Nr,18,43);
delay 0.2;
Wait(Skrzyzrad3);
Czysc(18,43);
Pisz(Nr,18,44);
delay 0.2;
Czysc(18,44);
Pisz(Nr,18,45);
delay 0.2;
Czysc(18,45);
Pisz(Nr,18,46);
delay 0.2;
Signal(Wolny_Wyjazd);
loop
if Lewyrad(1)=1 then
Lewyrad(1):=0;
exit;
end if;
end loop;
Czysc(18,46);
Pisz(Nr,19,46);
Signal(Skrzyzrad3);
delay 0.2;
Radiowalewy(Nr);
delay Crp;
end loop;
end loop;
end Autobus_Radiowapetla;
----------------------------------------------------------------KALISKIEGO-RADIOWA-------------------------------------------
task body Autobus_Kaliskiegoradiowa is
Dkr : Duration;
Ckr : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Dkr:=Duration(Float(Skr)/100.0);
Ckr:=Duration(Float(Okr)/100.0);
delay Dkr;
loop
while Dzien=True loop
Kaliskiegoprawy(Nr);
Skretnapetle:=Init(0);
Wait(Skrzyzkal4);
Czysc(19,24);
Pisz(Nr,18,24);
Prawykal(6):=1;
delay 0.2;
Wait(Skrzyzkal2);
Czysc(18,24);
Pisz(Nr,17,24);
Signal(Skrzyzkal4);
Signal(Skretnapetle);
delay 0.2;
loop
if Kalrad(0)=1 then
Kalrad(0):=0;
exit;
end if;
end loop;
Czysc(17,24);
Pisz(Nr,16,24);
Signal(Skrzyzkal2);
delay 0.2;
Kaliskiegoradiowa(Nr);
Wait(Skrzyzrad1);
Czysc(16,46);
Pisz(Nr,17,46);
Kalrad(31):=1;
delay 0.2;
Wait(Skrzyzrad3);
Czysc(17,46);
Pisz(Nr,18,46);
Signal(Skrzyzrad1);
delay 0.2;
loop
if Lewyrad(1)=1 then
Lewyrad(1):=0;
exit;
end if;
end loop;
Czysc(18,46);
Pisz(Nr,19,46);
Signal(Skrzyzrad3);
delay 0.2;
Radiowalewy(Nr);
delay Ckr;
end loop;
end loop;
end Autobus_Kaliskiegoradiowa;
----------------------------------------------RADIOWA-KALISKIEGO------------------------------------------------------
task body Autobus_Radiowakaliskiego is
Drk : Duration;
Crk : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Drk:=Duration(Float(Srk)/100.0);
delay Drk;
Crk:=Duration(Float(Ork)/100.0);
loop
while Dzien=True loop
Radiowaprawy(Nr);
Wait(Skrzyzrad4);
Czysc(19,49);
Pisz(Nr,18,49);
Prawyrad(6):=1;
delay 0.2;
Wait(Skrzyzrad2);
Czysc(18,49);
Pisz(Nr,17,49);
Signal(Skrzyzrad4);
delay 0.2;
loop
if Radkal(0)=1 then
Radkal(0):=0;
exit;
end if;
end loop;
Czysc(17,49);
Pisz(Nr,16,49);
Signal(Skrzyzrad2);
delay 0.2;
Radiowakaliskiego(Nr);
Wait(Skrzyzkal1);
Czysc(16,21);
Pisz(Nr,17,21);
Radkal(37):=1;
delay 0.2;
Wait(Skrzyzkal3);
Czysc(17,21);
Pisz(Nr,18,21);
Signal(Skrzyzkal1);
delay 0.2;
loop
if Lewykal(1)=1 then
Lewykal(1):=0;
exit;
end if;
end loop;
Czysc(18,21);
Pisz(Nr,19,21);
Signal(Skrzyzkal3);
delay 0.2;
Kaliskiegolewy(Nr);
delay Crk;
end loop;
end loop;
end Autobus_Radiowakaliskiego;
Aut : Autobus_Radiowakaliskiego (105, 150, 200);
Aut2 : Autobus_Kaliskiegoradiowa (105, 50, 200);
Aut3 : Autobus_Radiowapetla (523, 345, 233);
Aut4 : Autobus_Kaliskiegopetla (109, 200, 433);
Aut5 : Autobus_Radiowakaliskiego (310, 90, 200);
Aut6 : Autobus_Kaliskiegoradiowa (310, 240, 200);
Aut7 : Autobus_Nocny (601, 130);
Aut8 : Autobus_Kaliskiegopetla (109, 200, 433);
Aut9 : Autobus_Kaliskiegopetla (109, 200, 433);
Aut10 : Autobus_Radiowapetla (523, 345, 233);
Aut11 : Autobus_Radiowapetla (523, 345, 233);
Aut12 : Autobus_Radiowapetla (523, 345, 233);
Aut13 : Autobus_Kaliskiegopetla (109, 200, 433);
begin
Cursoroff;
Ulice(Miejsca_Na_Petli);
Rysuj:=False;
end Watsem;
Spotkania:
with Winconsoleex;
use Winconsoleex;
with Procpom;
use Procpom;
procedure WATspot is
Poziom : Boolean := False;
Pion : Boolean := False;
Dzien : Boolean := True;
Wolny_Wyjazd : Boolean := True;
Rysuj : Boolean := True;
Miejsca_Na_Petli : Integer := 3;
Wolne_Miejsca : Integer := Miejsca_Na_Petli;
Swiatlo : Integer := 600;
Dlugosc_Dnia : Integer := 5000;
Dlugosc_Nocy : Integer := 5000;
N : Integer := 0;
Prawykal : array (1 .. 6) of Integer := (others => 1);
Lewykal : array (1 .. 6) of Integer := (others => 1);
Prawyrad : array (1 .. 6) of Integer := (others => 1);
Lewyrad : array (1 .. 6) of Integer := (others => 1);
Radkal : array (0 .. 37) of Integer := (others => 1);
Kalrad : array (0 .. 31) of Integer := (others => 1);
task Doba;
task type Autobus_Kaliskiegopetla(Nr,Skp, Okp: Integer);
task type Autobus_Radiowapetla(Nr, Srp, Orp: Integer);
task type Autobus_Kaliskiegoradiowa(Nr, Skr, Okr: Integer);
task type Autobus_Radiowakaliskiego(Nr, Srk, Ork: Integer);
task type Autobus_Nocny(Nr, On: Integer);
task Swiatla;
task Kaliskiego_Lewy is
entry Odjazd (
Nr : Integer );
entry Skret (
Nr : Integer );
end Kaliskiego_Lewy;
task Kaliskiego_Prawy is
entry Przejazd (
Nr : Integer );
entry Skret (
Nr : Integer );
entry Przeciecie (
Nr : Integer );
end Kaliskiego_Prawy;
task Radiowa_Lewy is
entry Przejazd (
Nr : Integer );
entry Skret_Gora (
Nr : Integer );
entry Skret_Dol (
Nr : Integer );
end Radiowa_Lewy;
task Radiowa_Prawy is
entry Przejazd (
Nr : Integer );
entry Przeciecie (
Nr : Integer );
end Radiowa_Prawy;
------------------------------------------------------------KALISKIEGO LEWY-----------------------------------------
task body Kaliskiego_Lewy is
begin
loop
select
accept Odjazd (
Nr : Integer ) do
Czysc(16,21);
Pisz(Nr,17,21);
Radkal(37):=1;
delay 0.2;
Czysc(17,21);
Pisz(Nr,18,21);
delay 0.2;
loop
if Lewykal(1)=1 then
Lewykal(1):=0;
exit;
end if;
end loop;
Czysc(18,21);
Pisz(Nr,19,21);
delay 0.2;
end Odjazd;
or
accept Skret (
Nr : Integer ) do
Czysc(16,21);
Pisz(Nr,17,21);
Radkal(37):=1;
delay 0.2;
Kaliskiego_Prawy.Przeciecie(Nr);
end Skret;
or
delay 0.1;
end select;
end loop;
end Kaliskiego_Lewy;
-------------------------------------------KALISKIEGO PRAWY-------------------------------------------
task body Kaliskiego_Prawy is
begin
loop
select
accept Przejazd (
Nr : Integer ) do
Czysc(19,24);
Pisz(Nr,18,24);
Prawykal(6):=1;
delay 0.2;
Czysc(18,24);
Pisz(Nr,17,24);
delay 0.2;
loop
if Kalrad(0)=1 then
Kalrad(0):=0;
exit;
end if;
end loop;
Czysc(17,24);
Pisz(Nr,16,24);
delay 0.2;
end Przejazd;
or
when Wolne_Miejsca>0 =>
accept Skret (
Nr : Integer ) do
Czysc(19,24);
Pisz(Nr,18,25);
Prawykal(6):=1;
delay 0.2;
Czysc(18,25);
Pisz(Nr,18,26);
delay 0.2;
Czysc(18,26);
Pisz(Nr,18,27);
delay 0.2;
Czysc(18,27);
Wolne_Miejsca:=Wolne_Miejsca-1;
end Skret;
or
when Wolne_Miejsca>0 =>
accept Przeciecie (
Nr : Integer ) do
Czysc(17,21);
Pisz(Nr,18,22);
delay 0.2;
for T in 22..26 loop
Czysc(18,T);
Pisz(Nr,18,T+1);
delay 0.2;
end loop;
Czysc(18,27);
Wolne_Miejsca:=Wolne_Miejsca-1;
end Przeciecie;
or
delay 0.1;
end select;
end loop;
end Kaliskiego_Prawy;
-----------------------------------------------------RADIOWA LEWY--------------------------------------------------------
task body Radiowa_Lewy is
begin
loop
select
when Poziom=True =>
accept Skret_Gora (
Nr : Integer ) do
Czysc(18,42);
Pisz(Nr,17,43);
delay 0.2;
for Z in 43..45 loop
Czysc(17,Z);
Pisz(Nr,17,Z+1);
delay 0.2;
end loop;
Wolne_Miejsca:=Wolne_Miejsca+1;
Wolny_Wyjazd:=True;
Radiowa_Prawy.Przeciecie(Nr);
end Skret_Gora;
or
when Poziom=True =>
accept Skret_Dol (
Nr : Integer ) do
Czysc(18,42);
Pisz(Nr,18,43);
delay 0.2;
Czysc(18,43);
Pisz(Nr,18,44);
delay 0.2;
Czysc(18,44);
Pisz(Nr,18,45);
delay 0.2;
Czysc(18,45);
Pisz(Nr,18,46);
delay 0.2;
loop
if Lewyrad(1)=1 then
Lewyrad(1):=0;
exit;
end if;
end loop;
Czysc(18,46);
Pisz(Nr,19,46);
delay 0.2;
Wolne_Miejsca:=Wolne_Miejsca+1;
Wolny_Wyjazd:=True;
end Skret_Dol;
or
when Pion=True =>
accept Przejazd (
Nr : Integer ) do
Czysc(16,46);
Pisz(Nr,17,46);
Kalrad(31):=1;
delay 0.2;
Czysc(17,46);
Pisz(Nr,18,46);
delay 0.2;
loop
if Lewyrad(1)=1 then
Lewyrad(1):=0;
exit;
end if;
end loop;
Czysc(18,46);
Pisz(Nr,19,46);
delay 0.2;
end Przejazd;
or
delay 0.1;
end select;
end loop;
end Radiowa_Lewy;
-------------------------------------------RADIOWA PRAWY----------------------------------------------------------------
task body Radiowa_Prawy is
begin
loop
select
accept Przeciecie (
Nr : Integer ) do
Czysc(17,46);
for Z in 46..48 loop
Czysc(17,Z);
Pisz(Nr,17,Z+1);
delay 0.2;
end loop;
loop
if Radkal(0)=1 then
Radkal(0):=0;
exit;
end if;
end loop;
Czysc(17,49);
Pisz(Nr,16,49);
delay 0.2;
end Przeciecie;
or
when Pion=True =>
accept Przejazd (
Nr : Integer ) do
Czysc(19,49);
Pisz(Nr,18,49);
Prawyrad(6):=1;
delay 0.2;
Czysc(18,49);
Pisz(Nr,17,49);
delay 0.2;
loop
if Radkal(0)=1 then
Radkal(0):=0;
exit;
end if;
end loop;
Czysc(17,49);
Pisz(Nr,16,49);
delay 0.2;
end Przejazd;
or
delay 0.1;
end select;
end loop;
end Radiowa_Prawy;
task body Doba is
Dlugoscdnia,
Dlugoscnocy : Duration;
begin
Dlugoscdnia:=Duration(Float(Dlugosc_Dnia)/100.0);
Dlugoscnocy:=Duration(Float(Dlugosc_Nocy)/100.0);
loop
if Dzien=True then
delay Dlugoscdnia;
Dzien:=False;
else
delay Dlugoscnocy;
Dzien:=True;
end if;
end loop;
end Doba;
task body Swiatla is
Czas_Swiatla : Duration;
begin
Czas_Swiatla:=Duration(Float(Swiatlo)/100.0);
loop
exit when Rysuj=False;
end loop;
loop
swiatla1;
Pion:=False;
poziom:=true;
delay Czas_Swiatla;
swiatla2;
Poziom:=False;
Pion:=True;
delay Czas_Swiatla;
end loop;
end Swiatla;
procedure Napetli (
Nra : Integer ) is
K : Integer;
begin
K:=N;
Pisz(Nra,12+3*N,35);
N:=(N+1) mod Miejsca_Na_Petli;
delay 2.0;
loop
if Wolny_Wyjazd=True then
wolny_wyjazd:=false;
exit;
end if;
end loop;
Czysc(12+3*K,35);
Pisz(Nra,18,42);
end Napetli;
procedure Kaliskiegolewy (
Nra : Integer ) is
begin
for Z in 2..6 loop
loop
if Lewykal(Z)=1 then
exit;
end if;
end loop;
Czysc((17+Z),21);
Pisz(Nra,(18+Z),21);
Lewykal(Z-1):=1;
delay 0.2;
end loop;
Czysc(24,21);
Lewykal(6):=1;
end Kaliskiegolewy;
procedure Radiowalewy (
Nra : Integer ) is
begin
for Z in 2..6 loop
loop
if Lewyrad(Z)=1 then
Lewyrad(Z):=0;
exit;
end if;
end loop;
Czysc((17+Z),46);
Pisz(Nra,(18+Z),46);
Lewyrad(Z-1):=1;
delay 0.2;
end loop;
Czysc(24,46);
Lewyrad(6):=1;
end Radiowalewy;
procedure Radiowaprawy (
Nra : Integer ) is
begin
loop
if Prawyrad(1)=1 then
Prawyrad(1):=0;
exit;
end if;
end loop;
Pisz(Nra,24,49);
delay 0.2;
for Z in 2..6 loop
loop
if Prawyrad(Z)=1 then
Prawyrad(Z):=0;
exit;
end if;
end loop;
Czysc((26-Z),49);
Pisz(Nra,(25-Z),49);
Prawyrad(Z-1):=1;
delay 0.2;
end loop;
end Radiowaprawy;
procedure Kaliskiegoprawy (
Nra : Integer ) is
begin
loop
if Prawykal(1)=1 then
Prawykal(1):=0;
exit;
end if;
end loop;
Pisz(Nra,24,24);
delay 0.2;
for Z in 2..6 loop
loop
if Prawykal(Z)=1 then
Prawykal(Z):=0;
exit;
end if;
end loop;
Czysc((26-Z),24);
Pisz(Nra,(25-Z),24);
Prawykal(Z-1):=1;
delay 0.2;
end loop;
end Kaliskiegoprawy;
procedure Radiowakaliskiego (
Nra : Integer ) is
begin
loop
if Radkal(1)=1 then
Radkal(1):=0;
exit;
end if;
end loop;
Czysc(16,49);
Pisz(Nra,15,49);
Radkal(0):=1;
delay 0.2;
for I in 2..5 loop
loop
if Radkal(I)=1 then
Radkal(I):=0;
exit;
end if;
end loop;
Czysc(17-I,49);
Pisz(Nra,16-I,49);
Radkal(I-1):=1;
delay 0.2;
end loop;
for I in 1..8 loop
loop
if Radkal(5+I)=1 then
Radkal(5+I):=0;
exit;
end if;
end loop;
Czysc(12-I,50-I);
Pisz(Nra,11-I,49-I);
Radkal(I+4):=1;
delay 0.2;
end loop;
for I in 1..11 loop
loop
if Radkal(13+I)=1 then
Radkal(13+I):=0;
exit;
end if;
end loop;
Czysc(3,42-I);
Pisz(Nra,3,41-I);
Radkal(I+12):=1;
delay 0.2;
end loop;
for I in 1..9 loop
loop
if Radkal(24+I)=1 then
Radkal(24+I):=0;
exit;
end if;
end loop;
Czysc(2+I,31-I);
Pisz(Nra,3+I,30-I);
Radkal(I+23):=1;
delay 0.2;
end loop;
for I in 1..4 loop
loop
if Radkal(33+I)=1 then
Radkal(33+I):=0;
exit;
end if;
end loop;
Czysc(11+I,21);
Pisz(Nra,12+I,21);
Radkal(I+32):=1;
delay 0.2;
end loop;
end Radiowakaliskiego;
procedure Kaliskiegoradiowa (
Nra : Integer ) is
begin
loop
if Kalrad(1)=1 then
Kalrad(1):=0;
exit;
end if;
end loop;
Czysc(16,24);
Pisz(Nra,15,24);
Kalrad(0):=1;
delay 0.2;
for I in 2..4 loop
loop
if Kalrad(I)=1 then
Kalrad(I):=0;
exit;
end if;
end loop;
Czysc(17-I,24);
Pisz(Nra,16-I,24);
Kalrad(I-1):=1;
delay 0.2;
end loop;
for I in 1..8 loop
loop
if Kalrad(4+I)=1 then
Kalrad(4+I):=0;
exit;
end if;
end loop;
Czysc(13-I,23+I);
Pisz(Nra,12-I,24+I);
Kalrad(I+3):=1;
delay 0.2;
end loop;
for I in 1..7 loop
loop
if Kalrad(12+I)=1 then
Kalrad(12+I):=0;
exit;
end if;
end loop;
Czysc(4,31+I);
Pisz(Nra,4,32+I);
Kalrad(I+11):=1;
delay 0.2;
end loop;
for I in 1..7 loop
loop
if Kalrad(19+I)=1 then
Kalrad(19+I):=0;
exit;
end if;
end loop;
Czysc(3+I,38+I);
Pisz(Nra,4+I,39+I);
Kalrad(I+18):=1;
delay 0.2;
end loop;
for I in 1..5 loop
loop
if Kalrad(26+I)=1 then
Kalrad(26+I):=0;
exit;
end if;
end loop;
Czysc(10+I,46);
Pisz(Nra,11+I,46);
Kalrad(I+25):=1;
delay 0.2;
end loop;
end Kaliskiegoradiowa;
--------------------------------------------AUTOBUS_NOCNY------------------------------------------------------------------
task body Autobus_Nocny is
K : Integer := 0;
Dn : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Dn:=Duration(Float(On)/100.0);
loop
while Dzien=False loop
Radiowaprawy(Nr);
Radiowa_Prawy.Przejazd(Nr);
Radiowakaliskiego(Nr);
Kaliskiego_Lewy.Odjazd(Nr);
Kaliskiegolewy(Nr);
delay Dn;
Kaliskiegoprawy(Nr);
Kaliskiego_Prawy.Przejazd(Nr);
Kaliskiegoradiowa(Nr);
Radiowa_Lewy.Przejazd(Nr);
Radiowalewy(Nr);
delay Dn;
end loop;
end loop;
end Autobus_Nocny;
------------------------------------------------KALISKIEGO-PETLA----------------------------------------------------
task body Autobus_Kaliskiegopetla is
Dkp : Duration;
Ckp : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Ckp:=Duration(Float(Okp)/100.0);
Dkp:=Duration(Float(Skp)/100.0);
delay Dkp;
loop
while Dzien=True loop
Kaliskiegoprawy(Nr);
Kaliskiego_Prawy.Skret(Nr);
Napetli(Nr);
Radiowa_Lewy.Skret_Gora(Nr);
Radiowakaliskiego(Nr);
Kaliskiego_Lewy.Odjazd(Nr);
Kaliskiegolewy(Nr);
delay Ckp;
end loop;
end loop;
end Autobus_Kaliskiegopetla;
-----------------------------------------------------RADIOWA-PETLA-----------------------------------------------------
task body Autobus_Radiowapetla is
Drp : Duration;
Crp : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Drp:=Duration(Float(Srp)/100.0);
Crp:=Duration(Float(Srp)/100.0);
delay Drp;
loop
while Dzien=True loop
Radiowaprawy(Nr);
Radiowa_Prawy.Przejazd(Nr);
Radiowakaliskiego(Nr);
Kaliskiego_Lewy.Skret(Nr);
Napetli(Nr);
Radiowa_Lewy.Skret_Dol(Nr);
Radiowalewy(Nr);
delay Crp;
end loop;
end loop;
end Autobus_Radiowapetla;
----------------------------------------------------------------KALISKIEGO-RADIOWA-------------------------------------------
task body Autobus_Kaliskiegoradiowa is
Dkr : Duration;
Ckr : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Dkr:=Duration(Float(Skr)/100.0);
Ckr:=Duration(Float(Okr)/100.0);
delay Dkr;
loop
while Dzien=True loop
Kaliskiegoprawy(Nr);
Kaliskiego_Prawy.Przejazd(Nr);
Kaliskiegoradiowa(Nr);
Radiowa_Lewy.Przejazd(Nr);
Radiowalewy(Nr);
delay Ckr;
end loop;
end loop;
end Autobus_Kaliskiegoradiowa;
----------------------------------------------RADIOWA-KALISKIEGO------------------------------------------------------
task body Autobus_Radiowakaliskiego is
Drk : Duration;
Crk : Duration;
begin
loop
exit when Rysuj=False;
end loop;
Drk:=Duration(Float(Srk)/100.0);
delay Drk;
Crk:=Duration(Float(Ork)/100.0);
loop
while Dzien=True loop
Radiowaprawy(Nr);
Radiowa_Prawy.Przejazd(Nr);
Radiowakaliskiego(Nr);
Kaliskiego_Lewy.Odjazd(Nr);
Kaliskiegolewy(Nr);
delay Crk;
end loop;
end loop;
end Autobus_Radiowakaliskiego;
Aut : Autobus_Radiowakaliskiego (105, 150, 200);
Aut2 : Autobus_Kaliskiegoradiowa (105, 50, 200);
Aut3 : Autobus_Radiowapetla (523, 345, 233);
Aut4 : Autobus_Kaliskiegopetla (109, 200, 433);
Aut5 : Autobus_Radiowakaliskiego (310, 90, 200);
Aut6 : Autobus_Kaliskiegoradiowa (310, 240, 200);
Aut7 : Autobus_Nocny (601, 130);
begin
Cursoroff;
Ulice(Miejsca_Na_Petli);
Rysuj:=False;
end WATspot;
Procpom:
with Text_Io; use Text_Io;
with Ada.Text_Io; use Ada.Text_Io;
with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
with Winconsoleex; use Winconsoleex;
with Sem83;
use Sem83;
package body Procpom is
Nrk: Integer :=21;
Nrw: Integer :=2;
I: Integer:=0;
ekran: binary_semaphore:=init(1);
procedure Ulice(N: in Integer) is
begin
Text(White);
Movecursor(Nrw,Nrk);
Put("_____________ _______________");
Nrw:=Nrw+3;
Movecursor(Nrw,Nrk);
Put("______ ______ ________");
Nrw:=Nrw+1;
Nrk:=26;
while Nrk>20 loop
Movecursor(Nrw,Nrk);
Put("/ /");
Nrw:=Nrw+1;
Nrk:=Nrk-1;
end loop;
Nrk:=40;
Nrw:=6;
while Nrw<12 loop
Movecursor(Nrw,Nrk);
Put("\ \");
Nrw:=Nrw+1;
Nrk:=Nrk+1;
end loop;
Nrk:=20;
while Nrw<16 loop
Movecursor(Nrw,Nrk);
Put("| | | | | |");
Nrw:=Nrw+1;
end loop;
Movecursor(Nrw,Nrk);
Put("| ----- ----- ---");
Nrw:=Nrw+1;
Movecursor(Nrw,Nrk);
Put("|");
Nrw:=Nrw+1;
Movecursor(Nrw,Nrk);
Put("|");
Nrw:=Nrw+1;
Movecursor(Nrw,Nrk);
Put("| ----- ----- ---");
Nrw:=Nrw+1;
while Nrw<25 loop
Movecursor(Nrw,Nrk);
Put("| | | | | |");
Nrw:=Nrw+1;
end loop;
Nrk:=32;
Nrw:=11;
while Nrw>6 loop
Movecursor(Nrw,Nrk);
Put("/");
Nrw:=Nrw-1;
Nrk:=Nrk+1;
end loop;
Nrk:=41;
Nrw:=11;
while Nrw>6 loop
Movecursor(Nrw,Nrk);
Put("\");
Nrw:=Nrw-1;
Nrk:=Nrk-1;
end loop;
Nrw:=24;
Nrk:=32;
Movecursor(Nrw,Nrk);
Put("---------");
Nrk:=34;
Nrw:=12;
while I<N loop
Movecursor(Nrw,Nrk);
Put("| |");
Nrw:=Nrw+1;
Movecursor(Nrw,Nrk);
Put("\___/");
Nrw:=Nrw+2;
I:=I+1;
end loop;
end Ulice;
procedure Pisz(nr, X, Y: Integer) is
begin
wait(ekran);
movecursor(x,y);
Put(Nr,3);
signal(ekran);
end Pisz;
procedure czysc(X, Y: Integer) is
begin
Wait(ekran);
movecursor(x,y);
Put(" ");
Signal(ekran);
end czysc;
procedure swiatla1 is
begin
wait(ekran);
Movecursor(15,44);
Text(Red);
Put("@");
Movecursor(20,53);
Text(Red);
Put("@");
Movecursor(15,53);
Text(Green);
Put("@");
Movecursor(20,44);
Text(Green);
Put("@");
Text(White);
signal(ekran);
end swiatla1;
procedure swiatla2 is
begin
wait(ekran);
Movecursor(15,44);
Text(Green);
Put("@");
Movecursor(20,53);
Text(Green);
Put("@");
Movecursor(15,53);
Text(Red);
Put("@");
Movecursor(20,44);
Text(Red);
Put("@");
Text(White);
signal(ekran);
end swiatla2;
end Procpom;
ANALIZA POPRAWNOŚCI PROGRAMU:
Program spełnia własność żywotności ze względu na wzajemne wykluczanie. Każda próba wypisania swojej pozycji lub jej wymazania wymaga, aby dany proces skorzystał z funkcji zadeklarowanej w pakiecie „Procpom”. Jak widać obie te funkcję są obłożone semaforem binarnym uniemożliwiającym dwóm różnym procesom jednoczesne jej wykorzystanie (wait na początku, signal po zakończeniu wypisywania).
Program w wersji na spotkaniach spełnia własność żywotności:
- nie występują zakleszczenia dzięki temu, że żaden proces nie wymaga jednocześnie dwóch zasobów,
-istnieje możliwość głodzenia procesu chcącego skręcić po przejeździe ulicą Radiową na pętle, a co za tym idzie kolejnych procesów chcących skorzystać z lewego pasa skrzyżowania na Kaliskiego. Jest to jednak skutek obowiązujących w Polsce przepisów ruchu drogowego, przez co nie można traktować tego jako wady programu. Przy sensownej ilości procesów (procesów taką jest realna ilość autobusów jeżdżąc po tych trasach) zagłodzenie nie występuje.
-nie występują także blokady i mimo długotrwałego działania program nie zatrzymuje się.
Program w wersji na semaforach w przeciwieństwie do wersji na spotkaniach nie zawsze spełnia własność żywotności.
-z podobnych przyczyn jak w w/w rozwiązaniu występują tymczasowe głodzenia,
-tylko jeden proces wymaga dostępu do wielu zasobów na raz (autobus skręcający na pętle po przejeździe ulicą radiową). Żaden inny proces nie konkuruje z nim jednak o więcej niż jeden zasób i nawet, jeśli zajmie potrzebny mu zasób przed nim, to zwolni go po chwili, co da możliwość zajęcia go przez problematyczny proces,
-w rozwiązaniu tym występuje problem, jeśli chodzi o blokady. Przy słabszej konfiguracji sprzętowej, z niewyjaśnionych przyczyn, program zatrzymuje się po wykonaniu pewnej ilości kroków. Na komputerach „mocniejszych” problem ten nie występuje.