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.

z := z + 1;end selectend loop;end BUFOR;Zauważmy, że części specyfikacyjne procesów PRODUCENT i KONSUMENT sąpuste, procesy te nie świadczą bowiem żadnych usług innym procesom. Jedynym procesem,który świadczy usługi jest BUFOR.Nie potrzeba tu pomocniczego komunikatu JESZCZE(), ponieważ nie wymaga się, abyw dozorach występowały tylko instrukcje wejścia. Dzięki temu rozwiązanie w Adzie jestsymetryczne ze względu na producenta i konsumenta, a przez to bardziej przejrzyste.Gdy liczba wyprodukowanych porcji przekroczy maksymalną liczbę typuInteger,powstanie nadmiar w instrukcji dodawania d := d + 1. Aby tego uniknąć, można po niejdopisać instrukcjęif d = k*N then d := N; z := z - (k-l)*N; end if;przy czym k jest odpowiednio dobraną liczbą całkowitą (np. maxint div N).6.2.3 Czytelnicy i pisarzeDwie wersje rozwiązania w Adzie problemu czytelników i pisarzy można znaleźć wksiążce [BenA89] (zad. 6.6). Tutaj pokażemy, w jaki sposób proces zarządzający dostępem doczytelni można umieścić w pakiecie. Pakiet czytelnia udostępnia na zewnątrz proceduryczytanie i pisanie, sposób ich synchronizacji jest ukryty przed użytkownikiem.Rozwiązanie z możliwością zagłodzenia pisarzypackage czytelnia isprocedure czytanie(x: out Integer);procedure pisanie(x: in Integer);end;package body czytelnia isksiążka: Integer;task PORTIER isentry ZACZYNAM;entry KOŃCZĘ;entry PISZE(x: in Integer);end;task body PORTIER isilu_czyta: Integer := 0; — liczba czytającychbeginloopselectaccept 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 := x;end PISZĘ;165

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

Saved successfully!

Ooh no, something went wrong!