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.

Omówimy jeszcze rozwiązanie, w którym czytelnicy i pisarze pragnący jednocześniewejść do czytelni wchodzą do niej na przemian (pisarze pojedynczo, a czytelnicy w grupie).Użyjemy trzech rodzajów krotek: krotka o sygnaturze (integer, integer) ma takie samoznaczenie jak poprzednio, o sygnaturze (integer) służy do zliczania czekających czytelników,krotka ('start_czyt') zaś służy do wznawiania czytelników. Czytelnik próbuje dołączyć doinnych czytelników wtedy, gdy nie ma czekających pisarzy. Gdy mu się to nie uda, zwiększalicznik czekających czytelników i oczekuje na krotkę ('start_czyt'), która umożliwi murozpoczęcie czytania. Pisarz przed wejściem do czytelni zachowuje się tak samo, jak wpoprzednim rozwiązaniu. Natomiast po wyjściu z niej pobiera krotkę z liczbą czekającychczytelników i wprowadza do przestrzeni krotek odpowiednią liczbę krotek postaci ('start_czyt').Następnie zeruje licznik czekających czytelników i zwraca krotkę z nową liczbą czytającychczytelników. W ten sposób po każdym zakoiiczenhi pisania do czytelni jest wpuszczana grupaczytelników, którzy zebrali się w czasie tego pisania.Process CZYTELNIK(i: l..C);var c,p: integer;cc: integer; {czytelnicy czekający}beginwhile true do beginwlasne_sprawy;if TRY_INPUT(c:integer, 0) then OUTPUT(c+l, 0)else beginINPUT(cc:integer);OUTPUT(cc+l);INPUT('start_czyt')end;czyta;INPUT(c:integer, p:integer);OUTPUT(c-l, p)endend;process PISARZ(i: l..P);var c,p: integer;cc: integer; {czytelnicy czekający}beginwhile true do beginwlasne_sprawy;INPUT(c:integer, p:integer);if c > 0 then beginOUTPUT(c, p+l);INPUT (0, p:integer);p := p - 1end;pisze;INPUT (cc:integer);for i := 1 to cc do OUTPUT ('start_czyt');OUTPUT (0);OUTPUT (cc, p)endend;Rozwiązanie to kryje.w sobie pewne niebezpieczeństwo. Jeślijakiś czytelnikwykonaTRY_INPUT z sukcesem, ajeszcze nie wykona OUTPUT, to następny czytelnikwykonujący właśnie w tym czasie TRY_INPUT stwierdzi, iż krotki nie ma i zarejestruje się jakoczytelnik czekający (będzie mu się wydawać, że jest jakiś pisarz). Można to poprawić czyniącoperację TRY_INPUT sekcją krytyczną procesu. Wymaga to wprowadzenia do przestrzeni190

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

Saved successfully!

Ooh no, something went wrong!