12.07.2015 Views

Spis treœci - Patrz

Spis treœci - Patrz

Spis treœci - Patrz

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

end select;end loop;end PORTIER;procedure czytanie(x: out Integer) isPORTIER.ZACZYNAM;x := książka;PORTIER.KOŃCZĘ;end czytanie;procedure pisanie(x: in Integer) isPORTIER.PISZE(x);end pisanie;end czytelnia;Pisanie jest możliwe tylko wtedy, gdy zmienna ilu_czyta ma wartość 0. Czytelnicy mogątu zagłodzić pisarzy, jeśli na tyle często będą wywoływać wejście ZACZYNAM, że niedopuszczą, by wartość tej zmiennej zmalała do zera. Spotkanie w instrukcji accept PISZĘodbywa się zawsze tylko z jednym procesem piszącym, pozostałe muszą czekać, aż procesPORTIER znów dojdzie do wykonywania tej instrukcji.Jeżeli program główny poprzedzimy klauzulą with czytelnia;, to równolegle z tymprogramem będzie wykonywać się proces PORTIER.Rozwiązanie poprawneZmienimy część implementacyjną procesu PORTIER tak, aby czytanie było możliwetyłko wtedy, gdy nikt nie chce pisać. Można to sprawdzić stosując atrybut count wejściaPISZĘ. Stąd dodatkowy warunek przed spotkaniem w wejściu ZACZYNAM. Unika się w tensposób zagłodzenia pisarzy. Po zakończeniu pisania natomiast wpuszcza się wszystkichczekających czytelników. Unika się w ten sposób zagłodzenia czytelników.task body PORTIER isilu_czyta: Integer := 0; -- liczba czytającychbeginloopselectwhen PISZE'count = 0 =>accept ZACZYNAM;ilu_czyta := ilu_czyta + 1;oraccept KOŃCZĘ;ilu_czyta := ilu_czyta - 1;orwhen ilu_czyta = 0 =>accept PISZE(x: in Integer) doksiążka := xend PISZĘ;loopselectaccept ZACZYNAM;ilu_czyta := ilu_czyta + 1;else exit;end select;end loop;end select;end loop;end PORTIER;166

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

Saved successfully!

Ooh no, something went wrong!