Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
230 <strong>Programowanie</strong> wspóbiene. <strong>Systemy</strong> <strong>czasu</strong> <strong>rzeczywistego</strong><br />
8.1.2. Spotkania<br />
Ostatnie rozwizanie przypomina problem symulacji semafora dwustronnie ograniczonego<br />
(zob. podrozdzia 6.5) w oparciu o mechanizm spotka. Innymi sowy, procedury<br />
umieszczania porcji danych oraz pobierania porcji danych mogyby by przeniesione<br />
w przestrze adresow poniszego zadania, wykonujcego instrukcj select<br />
z dwoma wejciami Wstaw i Pobierz. Dozory wej zapewniaj, e dane nie bd umieszczane<br />
w penym buforze i pobierane z pustego.<br />
n: constant Integer := 10;<br />
task Bufor is<br />
entry Wstaw (X: in Typ);<br />
entry Pobierz(X: out Typ);<br />
end Bufor;<br />
task body Bufor is<br />
Buf: array (1..n) of Typ;<br />
wskP, wskK: Integer := 1;<br />
licznik: Integer := 0;<br />
begin<br />
loop<br />
select<br />
when licznik < n =><br />
accept Wstaw (X: in Typ) do<br />
Buf(wskP) := X;<br />
wskP := (wskP mod n) + 1;<br />
licznik := licznik + 1;<br />
end Wstaw;<br />
or<br />
when licznik > 0 =><br />
accept Pobierz(X: out Typ) do<br />
X := Buf(wskK);<br />
wskK := (wskK mod n) + 1;<br />
licznik := licznik - 1;<br />
end Pobierz;<br />
end select;<br />
end loop;<br />
end Bufor;<br />
Procesy producenta i konsumenta wstawiaj i pobieraj dane podczas spotkania z zadaniem<br />
Bufor odpowiednio w wejciu Wstaw i Pobierz.<br />
task body Producent is<br />
info: Typ;<br />
begin<br />
loop<br />
Produkuje_dane;<br />
Bufor.Wstaw(info);<br />
end loop;<br />
end Producent;<br />
task body Konsument is<br />
info: Typ;<br />
begin<br />
loop<br />
Bufor.Pobierz(info);