15.04.2014 Views

Programowanie współbieżne. Systemy czasu rzeczywistego - Helion

Programowanie współbieżne. Systemy czasu rzeczywistego - Helion

Programowanie współbieżne. Systemy czasu rzeczywistego - Helion

SHOW MORE
SHOW LESS

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);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!