Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
1.4.Wybraneproblemyprogramowaniawspółbieżnego
11
Wprzypadkugdyskładowas.wsemaforaprzyjmujedowolnenieujemnewartościcałko-
wite,semafornazywamyogólnym.Semafor,wktórymskładowataprzyjmujejedynie
wartości0lub1,nazywamysemaforembinarnym10.Zauważmy,żewykonanieoperacji
signalnasemaforzebinarnymowartościskładowejcałkowitejrównej1jestbłędem.
Wprzypadkugdykolejkasemaforajestpusta,wartośćskładowejnależałobywówczas
zwiększyćo1,cojestniedopuszczalne(innewersjesemaforówomówionewuwagach
doniniejszegorozdziału).
Narysunku1.5jestprzedstawionyprzykładrozwiązaniaproblemusekcjikrytycznej
dladwóchzadańZ1iZ2wykonywanychniezależnieodsiebie.Zadaniazostałyzapisane
zgodniezkonwencjąjęzykaAda11.Wwierszu1zostałzadeklarowanysemaforsprzy
użyciutypusemaforowegosemaforzdefiniowanegonastępująco:
typesemaforis
record
w:natural;
q:kolejka;
endrecord;
SpecyfikacjazadańZ1iZ2występujewwierszach2–3,aichtreści,odpowiednio,
wwierszach4–12oraz13–21.Wobuzadaniachużytonieskończonejinstrukcjiite-
racyjnejloop...endloop.Wkażdymjejobieguzadaniawykonująsekcjękrytyczną
(wiersze8i17).Załóżmy,żewjednymzzadań,np.Z1,należywykonaćsekcję
krytyczną.Wówczasrealizowanajestnajpierwoperacjawait(s)wwierszu7.Jeśli
zachodzis.wl1,toskładowejcałkowitejsemaforaszostajeprzypisanawartość0
izadanierozpoczynawykonywaniesekcjikrytycznej.Pojejwykonaniuskładowejs.w
jestzpowrotemprzypisywanawartość1przezoperacjęsignal(s)wwierszu9.Jeśli
zadanieZ2spróbujewykonaćswojąsekcjękrytycznąprzedukończeniemsekcjiprzez
zadanieZ1,tozadanieZ2zostaniewstrzymaneiskierowanedokolejkiprzezopera-
cjęwait(s)wwierszu16,ponieważs.wl0.DopierogdyzadanieZ1wyjdziezsekcji
krytycznej,operacjasignal(s)wwierszu9wznowiwykonywaniezadaniaZ2.
Nietrudnojestwykazać,żerozwiązaniezrys.1.5mawłasnośćwzajemnegowy-
kluczania.Załóżmy,żezadaniaZ1iZ2chcąjednocześniewykonaćsekcjekrytyczne.
Wtymceluwykonująoperacjęwait(s).Zdefinicjisemaforawynika,żeoperacjata
jestatomowa,więctylkojednemuzzadańudasięwejśćdosekcjikrytycznej.Dru-
gieznichzostaniewstrzymaneiskierowanedokolejki.Podobnie,jeśliwtrakcie
wykonywaniasekcjikrytycznejprzezjednozzadańdrugiezadaniebędzieusiłowało
takżewykonaćsekcjękrytyczną,tozostaniewstrzymane,ponieważwartośćskładowej
całkowitejsemaforasbędzierówna0.Takwięcniemożezajśćsytuacja,wktórejoba
zadaniajednocześnierealizująsekcjekrytyczne.Wprzedstawionymrozwiązaniunie
10Semaforbinarnynazywanyjesttakżemuteksem(ang.mutex).Określenietojestużywanem.in.
wbibliotekachPthreadsorazjava.util.concurrent.
11WjęzykuAdaprzyjęto,żekomentarzewprogramachrozpoczynająsięznakami--ikończąznakiem
nowegowiersza.Wniniejszejksiążcekomentarzewprogramachbędątakżeumieszczanemiędzyznakami
{i}lub/*i*/.