Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
14
1.Procesywspółbieżne
buformanieograniczonąpojemność,anastępniezmodyfikujemytorozwiązaniedla
buforaoograniczonejpojemności.Niechdanebędąnastępującedeklaracje:
bufor:array(0..)oftyp_danych;--nieograniczonybufor
początek,koniec:natural:=0;--indeksywbuforze
są_dane:semafor:=(07);--semaforogólnywskazujący,ileporcjidanychjest
--wbuforze
Zmiennabuforjestjednowymiarowątablicąonieograniczonymrozmiarzeoelementach
typutyp_danych.Zmiennepoczątekikoniecindeksamiwyznaczającymisekcję
tablicy,wktórejumieszczonedanedoprzetworzenia.Indekspoczątekwskazujena
pierwsządaną,akoniecnapierwszewolnemiejscewbuforze.Wartościpoczątko-
weindeksówwynoszą0.Niezmiennikiempodczaswspółpracyzadańjestnierówność
początekkoniec,przyczympocząteklkoniecoznacza,żewbuforzeniemadanych
doprzetworzenia.Jeśliwbuforzeniemadanych,akonsumentbędziepróbowałje
pobrać,tojegodziałaniepowinnozostaćwstrzymanedomomentupojawieniasiędanych
wbuforze.Abytozapewnić,używamysemaforaogólnegosą_dane,któregoskładowa
całkowitawskazuje,ileporcjidanychjestwbuforze.Narysunku1.7jestprzedstawione
1.taskProducent;--specyfikacjazadań
2.taskKonsument;
3.taskbodyProducentis--treśćzadaniaProducent
4.
dane:typ_danych;--zmiennapomocniczazawierającaporcjędanych
5.begin
6.
loop
7.
PRODUKUJdane;
8.
bufor(koniec):=dane;--wstawieniedanychdobufora
9.
koniec:=koniec+1;
10.
signal(są_dane);--sygnalizujwstawieniedanych
11.
endloop;
12.endProducent;
13.taskbodyKonsumentis--treśćzadaniaKonsument
14.
dane:typ_danych;--zmiennapomocnicza
15.begin
16.
loop
17.
wait(są_dane);--sprawdź,czywbuforzedane
18.
dane:=bufor(początek);--pobraniedanych
19.
początek:=początek+1;
20.
KONSUMUJdane;
21.
endloop;
22.endKonsument;
Rysunek1070Rozwiązanieproblemuproducentaikonsumentaznieograniczonymbuforem