Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
1.4.Wybraneproblemyprogramowaniawspółbieżnego
15
rozwiązanieproblemuproducentaikonsumentazużyciemnieograniczonegobufora.
Producentpoumieszczeniuporcjidanychwbuforze(wiersze8–9)zwiększao1war-
tośćskładowejcałkowitejsemaforasą_danelubwznawiazadaniekonsumenta,jeśli
czekaonowkolejcenawstawieniedanych(wiersz10).Konsument,chcącpobrać
danezbufora,wykonujeoperacjęwait(są_dane)wwierszu17.Jeśliwartośćskładowej
całkowitejsemaforajestdodatnia,tozmniejszanajestonao1inastępujepobranie
danych(wiersze18–19).Wprzeciwnymrazie,tj.gdyzachodzi_dane.wl0,zadanie
konsumentajestwstrzymywanedomomentuwstawieniadanychdobufora.
Zauważmy,żerolasemaforasą_danejestniecoinnaniżsemaforaswrozwiązaniu
problemusekcjikrytycznej(p.1.4.1).Semaforssłużyłdosynchronizowaniadostępu
zadańdozasobu.Synchronizacjageneralniepoleganatym,żepewnezadanieuzyskuje
wiedzęostaniewykonywaniainnegozadania(lubzadań).JeślizadanieZ1chcesko-
rzystaćzzasobu,wykonującoperacjęwait(s)(rys.1.5,wiersz7),towprzypadkugdy
zasóbjestwolny,zostajeonprzydzielonyzadaniuZ1,wprzeciwnymraziewykonywanie
zadaniaZ1zostajewstrzymane.TymsamymzadanieZ1nuzyskuje”wiedzęostanie
wykonywaniazadaniaZ2,tj.czykorzystaonozzasobu,czynie.Wracającdoproblemu
producentaikonsumenta,semaforsą_danesłużydouzyskaniawiedzyotym,czy
producentumieściłdanewbuforze.Wzależnościodtego,czydanezostałyumieszczone,
czynie,spełnionyjestwarunek_dane.w>0lub_dane.wl0.Takieużycie
semaforaokreślanejestmianemsynchronizacjiwarunku(ang.condition/eventsyn-
chronization).Stosowaniesynchronizacjiwarunkujestniezbędne,jeślipewnaoperacja
możebyćwsposóbpoprawnywykonanaprzezzadanietylkowtedy,gdywcześniejinne
zadaniewykonałoswojąoperacjęlubgdywystąpiłookreślonezdarzenie.
Przekształcimyterazrozwiązanieproblemuproducentaikonsumentazrys.1.7tak,
abydanedoprzetworzeniabyłygromadzonewbuforzeoograniczonejpojemności.
Przyjmijmynastępującedeklaracje:
bufor:array(0..n11)oftyp_danych;--ograniczonybufor
początek,koniec:natural:=0;--indeksywbuforze
są_dane:semafor:=(07);--semaforogólnywskazujący,ileporcjidanychjest
--wbuforze
jest_miejsce:semafor:=(n7);--semaforogólnywskazujący,ilemiejscajest
--wbuforze
Zmiennabuforjestobecnien-elementowątablicąocyklicznejorganizacji.Oznacza
to,żepowstawieniuporcjidanychdobuforanapozycjęn11wartośćindeksukoniec
wyznaczającegopierwszewolnemiejscewbuforzejestustalanana0.Podobniemody-
fikowanyjestindekspoczątekpopobraniudanejzpozycjin11.Deklaracjezmiennych
początekikoniecorazsemaforasą_danenieulegajązmianie.Dodatkowowprowadzamy
semaforogólnyjest_miejsceowartościpoczątkowejnwceluzapobieżeniasytuacji,
wktórejproducentbędziewstawiałdanedopełnegobufora.Zmodyfikowanerozwiąza-
nieproblemuproducentaikonsumentajestprzedstawionenarys.1.8.Wrozwiązaniu
tymbezzmianpozostajeochronaprzedpobieraniemdanychzpustegobufora(wier-
sze11i18),natomiastproducent,bydokonaćwstawianiadanych,najpierwrealizuje