Professional Documents
Culture Documents
Exclusão Mútua e Objectos Partilhados: Problema Do Jardim Ornamentado
Exclusão Mútua e Objectos Partilhados: Problema Do Jardim Ornamentado
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
/XtV *RPHV
Garden
West Turnstile
people
East Turnstile
east,west
Turnstile run()
people
Counter increment()
display
display
NumberCanvas setvalue()
private void go() { counter = new Counter(counterD); west = new Turnstile(westD,counter); east = new Turnstile(eastD,counter); west.start(); east.start(); }
.RXQWHU'ZHVW'HHDVW'VmRREMH.WRVGD.ODVVH 1XPEHU&DQYDV
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV /XtV *RPHV
a classe Turnstile
class Turnstile extends Thread { NumberCanvas display; Counter people; Turnstile(NumberCanvas n,Counter c) { display = n; people = c; }
public void run() { try{ display.setvalue(0); for (int i=1;i<=Garden.MAX;i++){ Thread.sleep(500); //0.5 segundo entre chegadas display.setvalue(i); people.increment(); } } catch (InterruptedException e) {} }}
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
/XtV *RPHV
a classe Counter
class Counter { int value=0; NumberCanvas display; Counter(NumberCanvas n) { display=n; display.setvalue(value); } void increment() { int temp = value; //ler valor Simulate.HWinterrupt(); value=temp+1; //escrevre valor display.setvalue(value); } }
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV /XtV *RPHV
west 3&
SURJUDPD .RQWDGRU
.yGLJRSDUWLOKDGR
east 3&
SURJUDPD .RQWDGRU
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
/XtV *RPHV
GARDEN
value
east: TURNSTILE
go end arrive
value:VAR
read write
display
value
west: TURNSTILE
2SUR.HVVRVARHVSH.LIL.DRD.HVVRSDUDOHLWXUDHHV.ULWDQR.RQWDGRU YDULiYHOSDUWLOKDGRvalue. 2LQ.UHPHQWRpHVSH.LIL.DGRQRLQWHULRUGH TURNSTILE GHVGHTXHDV H[H.Xo}HVGRVPpWRGRVQmRVHMDPDWyPL.DVLHRVREMH.WRVWKUHDGeast H west SRGHPVHULQWHU.DODGRVQDVVXDVD.o}HVread H write
/XtV *RPHV
3URJUDPDomR&RQ.RUUHQWH
([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
TURNSTILE = (go -> RUN), RUN = (arrive-> INCREMENT |end -> TURNSTILE), INCREMENT = (value.read[x:T] -> value.write[x+1]->RUN )+VarAlpha.
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
/XtV *RPHV
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
/XtV *RPHV
1RVSURJUDPDV.RQ.RUUHQWHVRVHUURVEXJVSURYR.DGRVSHOD LQWHUIHUrQ.LDVmRPXLWRGLIt.HLVGHOR.DOL]DU$VROXomRWtSL.D SDUDHYLWDUHVWHWLSRGHHUURVpIRUQH.HUPpWRGRVGHD.HVVR PXWXDPHQWHH[.OXVLYRSDUDREMH.WRVSDUWLOKDGRVGHVWD IRUPDJDUDQWLPRVTXHDD.WXDOL]DomRQmRpLQWHUURPSLGDSRU D.WXDOL]Do}HV.RQ.RUUHQWHV$H[.OXVmRP~WXDSRGHVHU PRGHODGDDWUDYpVGHD.o}HVDWyPL.DV
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV /XtV *RPHV
synchronized(counter) {counter.increment();}
3DUDJDUDQWLURD.HVVRSRUH[.OXVmRP~WXDDXP REMH.WRWRGRVRVPpWRGRVGRVREMH.WRV .RQ.RUUHQWHVGHYHPVHUVLQ.URQL]DGRV
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV /XtV *RPHV
LOCK = (acquire->release->LOCK). ||LOCKVAR = (LOCK || VAR). set VarAlpha = {value.{read[T],write[T], acquire, release}} PRGLIL.DPRVWDPEpPTURNSTILESDUDD.WLYDUHGHVD.WLYDUROR.N TURNSTILE = (go -> RUN), RUN = (arrive-> INCREMENT |end -> TURNSTILE), INCREMENT = (value.acquire -> value.read[x:T]->value.write[x+1] -> value.release->RUN )+VarAlpha.
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV /XtV *RPHV
3URJUDPDomR&RQ.RUUHQWH
([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
/XtV *RPHV
INCREMENT = (acquire->read[x:T] -> (when (x<N) write[x+1] ->release->increment->INCREMENT ) )+{read[T],write[T]}. ||COUNTER = (INCREMENT||LOCK||VAR)@{increment}.
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
/XtV *RPHV
8PDGHV.ULomRPDLVDEVWUD.WDGHCOUNTERTXHJHUDXP/76LGrQWL.R
COUNTER = COUNTER[0] COUNTER[v:T] = (when (v<N) increment -> COUNTER[v+1]). (VWHSUR.HVVRH[LEHXP.RPSRUWDPHQWRHTXLYDOHQWHLHWHPXP .RPSRUWDPHQWRREVHUYiYHOLGrQWL.R
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV /XtV *RPHV
Sumrio .RQ.HLWRV
z LQWHUIHUrQ.LDGHSUR.HVVRV z H[.OXVmRP~WXD
PRGHORV
z PRGHO.KH.NLQJYHULIL.DomRSDUDDLQWHUIHUrQ.LD z PRGHODUDH[.OXVmRP~WXD
LPSOHPHQWDomRHP-DYD
z LQWHUIHUrQ.LDGRVWKUHDGVHPREMH.WRVSDUWLOKDGRVQR-DYD z H[.OXomRP~WXDQR-DYDV\Q.KURQL]HGREMH.WRVPpWRGRV
3URJUDPDomR&RQ.RUUHQWH ([.OXVmR0~WXDH2EMH.WRV3DUWLOKDGRV
/XtV *RPHV