Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
16
1.Procesywspółbieżne
1.taskProducent;--specyfikacjazadań
2.taskKonsument;
3.taskbodyProducentis--treśćzadaniaProducent
4.
dane:typ_danych;--zmiennapomocniczazawierającaporcjędanych
5.begin
6.
loop
7.
PRODUKUJdane;
8.
wait(jest_miejsce);--sprawdź,czywbuforzejestmiejsce
9.
bufor(koniec):=dane;--wstawieniedanych
10.
koniec:=(koniec+1)modn;
11.
signal(są_dane);--sygnalizuj,żedanezostaływstawione
12.
endloop;
13.endProducent;
14.taskbodyKonsumentis--treśćzadaniaKonsument
15.
dane:typ_danych;--zmiennapomocnicza
16.begin
17.
loop
18.
wait(są_dane);--sprawdź,czywbuforzedane
19.
dane:=bufor(początek);--pobraniedanych
20.
początek:=(początek+1)modn;
21.
signal(jest_miejsce);--sygnalizuj,żewbuforzejestmiejsce
22.
KONSUMUJdane;
23.
endloop;
24.endKonsument;
Rysunek1080Rozwiązanieproblemuproducentaikonsumentazograniczonymbuforem
operacjęwait(jest_miejsce)wwierszu8.Jeśliwartośćskładowejcałkowitejsemafora
jest_miejscejestdodatnia,tozostajeonazmniejszonao1iproducentmożedokonać
wstawienia.Jeśliwartośćtajestrówna0,cooznacza,żebuforjestpełny,tozadanie
producentajestwstrzymywaneiumieszczanewkolejce.Popobraniudanychprzez
konsumentawykonywanajestoperacjasignal(jest_miejsce)(wiersz21),którapowoduje
albozwiększeniewartościskładowejcałkowitejsemaforajest_miejsce,albowznowienie
wykonywaniazadaniaproducenta,jeśliczekałoonowkolejce.
Możnawykazać,żewrozwiązaniuproblemuproducentaikonsumentazograni-
czonymbuforemniewystąpipobraniedanychzpustegobuforaaniichwstawieniedo
pełnegobufora.Ponadtomożnaudowodnić,żeniemożewystąpićzakleszczenie,tj.
jednoczesnewstrzymaniewykonywaniazadańproducentaikonsumenta,orazżeżadne
zzadańniemożebyćzagłodzone.
Zauważmy,żewprzedstawionymrozwiązaniusumaskładowychcałkowitychsema-
forówsą_daneorazjest_miejscenieprzekraczarozmiarubuforan.Wtrakciedziałania
programuzrys.1.8spełnionyjestniezmiennik:0_dane.w+jest_miejsce.wn.