9374j Skrevet 3. april 2006 Del Skrevet 3. april 2006 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
Paull Skrevet 3. april 2006 Del Skrevet 3. april 2006 (endret) Hehe, noen som har en oppgave å levere inn snart? Edit: Hint - det er to kall, og kun ett blir benyttet i eksemplet.. Resten følger vel ganske logisk? Endret 3. april 2006 av Paull Lenke til kommentar
9374j Skrevet 3. april 2006 Forfatter Del Skrevet 3. april 2006 Hehe, neeh...trenger all den hjelp som jeg kan få.Tips og andre ting å legge til? Ja takk Lenke til kommentar
Paull Skrevet 3. april 2006 Del Skrevet 3. april 2006 (endret) 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.. ) Endret 3. april 2006 av Paull Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå