Gå til innhold

Bruk av semaforer


Anbefalte innlegg

Ved bruk av semaforer er det viktig at kallene wait og signal kommer i rett rekkefølge. La oss anta en binær semafor mutex som benyttes til gjensidig utelukkelse slik som vist nedenfor. Mutex har startverdien 1. I dette eksemplet er det en feil. Hva er feil, og hva blir konsekvensene? Hva er rett programkode i dette tilfellet?

 

wait(mutex);

adgang til felles dataområde

wait(mutex);

Lenke til kommentar
Videoannonse
Annonse

OK, semaforen er initielt 1, og en wait() på den vil blokkere dersom verdien er 0, helt til det blir sendt en signal() på den. Så, det første som skjer, er at wait() kalles, og semaforens verdi reduseres. Siden verdien var 1, er den 0 nå, men tråden vil fortsette å kjøre. En eventuell annen tråd som nå kaller wait() vil finne at verdien er 0, og blokkere.

So far, so good, det er jo meningen med mutexen. Problemet er på slutten, der wait() blir kalt en gang til. Nå vil den første tråden finne at verdien er 0 og blokkere. Siden det nå aldri vil komme et signal() på semaforen, har vi nå en deadlock.

Så, løsningen er å utføre en signal() på semaforen etter tråden er ferdig med å aksessere de felles dataene, istedetfor wait() som er angitt i eksemplet.

Koden blir da:

 

wait(mutex);

adgang til felles dataområde

signal(mutex);

 

(Om jeg husker rett.. :p )

Endret av Paull
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...