Está en la página 1de 3

Problema del Jardn Ornamental

Marta Poyatos Yuste

Problema del Jardn Ornamental:


Tenemos un bonito jardn que est abierto al pblico que debe paga una entrada para disfrutar de l. La entrada es controlada por dos tornos, los gerentes del jardn desean que en cada momento puedan saber cuntas personas hay dentro. Queremos hacer una sencilla simulacin de su funcionamiento: - Cada Torno ser manejado por un proceso separado en el programa. - Los procesos de los tornos se ejecutarn concurrentemente. - Usamos una variable global para contar el nmero actual de visitantes. - Simulamos que entran 20 por cada torno y mostramos el resultado.

1) Sin exclusin mutua.


program EjercicioJardin; process type Puerta(var tot:integer); var i:integer; begin for i:=1 to 20 do tot:=tot+1; end; var P1,P2:Puerta; total:integer; begin total:=0; cobegin p1(total);p2(total); coend; write('Total:',total); end.

Problema del Jardn Ornamental

Marta Poyatos Yuste

2) Con exclusin mutua.


program EjercicioJardinDekker; type tControl=record control1,control2:boolean; turno:integer; end; var total:integer; Con:tControl; process Puerta1 (var p: tControl; var tot:integer); var i:integer; begin for i:=1 to 20 do begin p.control1:=true; while p.control2 do if p.turno <> 1 then begin p.control1:=false; while p.turno <> 1 do; p.control1:=true; end; tot:=tot+1; write('P1 '); p.control1:=false; p.turno:=2; end; end; process Puerta2 (var p: tControl; var tot:integer); var i:integer; begin for i:=1 to 20 do begin p.control2:=true; while p.control1 do if p.turno <> 2 then begin p.control2:=false; while p.turno <> 2 do; p.control2:=true; end; tot:=tot+1; write('P2 '); p.control2:=false; p.turno:=1; end; end; begin total:=0; Con.control1:=false; Con.control2:=false; Con.turno:=1; cobegin Puerta1(Con,total); Puerta2(Con,total); coend; write('Total:',total); end.

Problema del Jardn Ornamental

Marta Poyatos Yuste

3) Con tres puertas y solucionado mediante el algoritmo de Lamport


program EjercioJardinLamport; var C:array[0..3] of (cogenumero,nocogenumero); numero:array[0..3] of integer; var total:integer; process type Puerta (var tot:integer; var proc:integer); var i:integer; j:integer; function max:integer var h,largo:integer; begin largo:=0; for h:=1 to 3 do if numero[h]>largo then largo:=numero[h]; max:=largo+1 end; function comparar (m,n:integer):boolean; begin if(numero[m]=0)or(numero[m]>numero[n])then comparar:=false else if numero[m]<numero[n]then comparar:=true else comparar:=(m<n) end; begin for i:=1 to 20 do begin C[proc]:=cogenumero; numero[proc]:=max; C[proc]:=nocogenumero; for j:=1 to 3 do begin while (C[j]=cogenumero)do; while comparar(j,proc) do; end; tot:=tot+1; writeln('Proceso: ',proc,'Persona:',i); numero[proc]:=0; end; end; var Puerta1,Puerta2,Puerta3:Puerta; p1,p2,p3:integer; begin total:=0; p1:=1;p2:=2;p3:=3; cobegin Puerta1(total,p1); Puerta2(total,p2); Puerta3(total,p3); coend; write('Total:',total); end.

También podría gustarte