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.

Jeżeli w czytelni nie ma pisarza, to zgłaszający się czytelnik uzyskuje natychmiastdostęp do czytelni. Nie ma przy tym znaczenia, czy jakiś pisarz czeka w tym czasie, czy teżnie. Jeśli po zakończeniu pisania pisarz stwierdzi, że jacyś czytelnicy czekają na dostęp doczytelni, to natychmiast wznawia ich wykonując w pętli repeat odpowiednią liczbę razyoperację signal (CZYTELNICY). Każdorazowe wykonanie tej operacji powoduje, że pisarzzwalnia monitor, udostępniając go wznowionemu czytelnikowi. Czytelnik kończy wykonywanieprocedury POCZ_CZYTANIA, a następnie opuszcza monitor, który znów zajmuje pisarzwykonujący pętlę repeat. W tym rozwiązaniu pisarz nie może zakończyć proceduryKON_PISANIA, zanim nie wpuści do czytelni wszystkich czekających czytelników. Jeśli zprocedury tej usuniemy pętlę repeat pozostawiając tylko jedną instrukcję signal(CZYTELNICY), a na końcu procedury POCZ.CZYTANIA dodamy instrukcję signal(CZYTELNICY), to otrzymamy rozwiązanie, w którym pisarz wychodzący z czytelni wpuszczatylko pierwszego czekającego czytelnika, który z kolei wpuszcza następnego itd. Inaczejmówiąc, pisarz, zamiast sam wysyłać wszystkie sygnały, uruchamia ich „kaskadę".Rozwiązanie poprawneAby uniknąć zgłodzenia trzeba podczas żądania dostępu do czytelni przez czytelnikasprawdzać, czy jakiś pisarz nie czeka już na wejście do czytelni. Jeśli tak, to czytelnik musibyć wstrzymany. Natomiast po zakończeniu pisania są wznawiani przede wszystkimczytelnicy, podobnie jak w pierwszym rozwiązaniu. Wznawianie pisarza, gdy są czekającyczytelnicy, mogłoby spowodować zagłodzenie czytelników. Rozwiązanie poprawne różni sięzatem od rozwiązania poprzedniego tylko procedurą POCZ_CZYTANIA:export procedure POCZ.CZYTANIA;beginif not empty(PISARZE) or (pisze > 0) thenwait CZYTELNICY);czyta := czyta + lend; {POCZ.CZYTANIA}4.2.4 Pięciu filozofówRozwiązanie z możliwością zagłodzeniaDla każdego filozofa pamiętamy, ile leżących przy nim widelców jest wolnych - służy dotego tablica wolne. Proces, zgłaszając żądanie przydziału widelców, podaje swój numer. Najego podstawie można stwierdzić, czy oba widelce są wolne. Jeśli nie, to proces jestwstrzymywany. Do wstrzymywania każdego procesu jest stosowana, odrębna zmienna. -element tablicy FILOZOF. Dzięki temu po odłożeniu widelców przez jednego z filozofówmożna próbować wznowić tylko jego sąsiadów.monitor WIDELCE;var wolne: array[0..4] of integer;FILOZOF: array[0..4] of condition;i: integer;export procedure BIORĘ(i: integer);beginwhile wolne [i] < 2 do wait(FILOZOF[i]);wolne [(i + 4) mod 5] := wolne [(i + 4) mod 5] - l;wolne [(i +1) mod 5] := wolne [(i +1) mod 5] – l;71

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

Saved successfully!

Ooh no, something went wrong!