Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
232 <strong>Programowanie</strong> wspóbiene. <strong>Systemy</strong> <strong>czasu</strong> <strong>rzeczywistego</strong><br />
Producenci i konsumenci, którzy chc — odpowiednio — umieci lub pobra porcje<br />
danych z bufora, wywouj procedury monitora Bufor.Wstaw(...) i Bufor.Pobierz(...).<br />
Zmienne warunkowe Miejsca i Dane pozwalaj na wywaszczenie z monitora producentów<br />
(operacja wait(Miejsca)), jeeli bufor jest peny, oraz konsumentów (operacja<br />
wait(Porcje)), jeeli bufor jest pusty. Producenci s zawieszeni w kolejce zmiennej<br />
warunkowej Miejsca, konsumenci natomiast w kolejce zmiennej warunkowej Dane.<br />
Ostatnie instrukcje procedur Wstaw i Pobierz wznawiaj potencjalnie zawieszone procesy<br />
w kolejkach zmiennych warunkowych, wykonujc operacje — odpowiednio —<br />
signal(Dane), która wznawia jednego z konsumentów, i signal(Miejsca), która wznawia<br />
jednego z producentów. Funkcja empty(Miejsca) zapewnia, e operacja wznawiania<br />
producentów zawieszonych w kolejce zmiennej jest wykonywana tylko wówczas,<br />
gdy ta kolejka nie jest pusta. Analogiczne znaczenie ma funkcja empty(Dane) w stosunku<br />
do konsumentów.<br />
8.1.4. Obiekty chronione<br />
Rozwizanie problemu producenta i konsumenta oparte na mechanizmie obiektu chronionego<br />
jest nastpujce:<br />
type Elementy is array(Integer range ) of Element;<br />
n: constant Integer := 10;<br />
protected type Bufor(n: Integer) is<br />
entry Pobierz(E: out Element);<br />
entry Wstaw(E: in Element);<br />
private<br />
IndexWej, IndexWyj: Integer := 0;<br />
Ile: Integer := 0; -- liczba porcji danych w buforze<br />
Buf: Elementy(1..n);<br />
end Bufor;<br />
protected body Bufor is<br />
entry Pobierz(E: out Element) when Ile > 0 is<br />
begin<br />
IndexWyj := (IndexWyj mod n) + 1;<br />
E := Buf(IndexWyj);<br />
Ile := Ile - 1;<br />
end Pobierz;<br />
entry Wstaw(E: in Element) when Ile < n is<br />
begin<br />
Buf(IndexWej) := E;<br />
IndexWej := (IndexWej mod n) + 1;<br />
Ile := Ile + 1;<br />
end Wstaw;<br />
end Bufor;<br />
procedure producenciKonsumenci is<br />
B1: Bufor(5);<br />
task type Producent;<br />
task body Producent is<br />
X:Element := 1;<br />
begin<br />
loop<br />
-- produkuje<br />
B1.Wstaw(X);