Anda di halaman 1dari 5

program ProdConsMon1; monitor canal; export escribe,lee; var n : integer; leido : boolean; cdatos,cleido:condition; procedure escribe(m:integer); begin if not

leido then delay(cleido); n:= m; leido:=false; resume(cdatos); end; procedure lee(var m: integer); begin if leido then delay(cdatos); m := n ; leido:=true; resume(cleido); end; begin leido:=true ; end; process productor ; var m: integer ; begin repeat m:=random (20); canal.escribe(m) ; forever end ; process consumidor ; var m: integer ; begin repeat canal.lee(m) ; write (m) ; forever end; begin cobegin productor ; consumidor ; coend ; end.

program prog ; var n : integer ; monitor s ; export sinitial, swait,ssignal ; var valor:integer ; nonulo : condition ; procedure sinitial(n : integer ) ; begin valor := n ; end; procedure swait ; begin if valor valor := end; procedure ssignal ; begin valor := resume ( end; end;

= 0 then delay ( nonulo ) ; valor-1;

valor + 1 ; nonulo ) ;

process p1 ; var i : integer ; begin for i :=1 to 10 do begin s.swait ; n := n + 1 ; s.ssignal ; end ; end ;

process p2 ; var i : integer ; begin for i :=1 to 10 do begin s.swait ; n := n + 1 ; s.ssignal ; end; end; begin n := 0 ; s.sinitial ( 1 ) ; cobegin p1 ; p2 ; coend ; end.

program philchan;

(* Dining Philsophers - channel version *) const nphil = 5; maxphils = 4; type synchan = array[0..maxphils] of var index: integer; getforks,putforks: synchan; process type philosopher(n: integer); begin repeat sleep(random(5)); (* THINKING *) getforks[n] ! any; sleep(random(5)); (* EATING *) putforks[n] ! any; forever end; (* philosopher *) var philos: array[0..maxphils] of philosopher; process forkcntrl; var forks: array[0..maxphils] of integer; i: integer; begin for i := 0 to maxphils do forks[i] := 2; repeat select for i := 0 to maxphils replicate when forks[i] = 2 => getforks[i] ? any; forks[(i+1) mod nphil] := forks[(i+1) forks[(i+4) mod nphil] := forks[(i+4) writeln('Filosfo ',i:1,' Comiendo'); or for i := 0 to maxphils replicate putforks[i] ? any; forks[(i+1) mod nphil] := forks[(i+1) forks[(i+4) mod nphil] := forks[(i+4) or terminate end forever end; (* forkcont *) begin cobegin for index := 0 to maxphils do philos[index](index); forkcntrl; coend; end.

channel of synchronous;

mod nphil] - 1; mod nphil] - 1;

mod nphil] + 1; mod nphil] + 1;

program dephil ; const var var var N = 5 ; horquillas : array [1..N] of semaphore; lacayo : semaphore ; imprimir : semaphore ; ;

procedure pensar(i :Integer ) begin

wait ( imprimir ); for i:= 1 to i do write( ' '); writeln ( 'Hambriento' ); signal ( imprimir ); end; procedure comer(i :Integer ); begin wait( imprimir ); for i:= 1 to i do write( ' '); Writeln ( 'Comiendo' ); signal ( imprimir ); wait ( imprimir ); for i:= 1 to i do write( ' ' ); Writeln ( 'Tenedor' ); signal ( imprimir ); end ; function begin izquierda:=i; end ; function begin end ; procedure getforks ( i : Integer ); begin wait ( lacayo ); wait ( horquillas [ derecha ( i )]); wait ( horquillas [ izquierda ( i )]); end ; procedure putforks ( i : Integer ); begin signal ( horquillas [ derecha ( i )]); signal( horquillas [ izquierda ( i )]); signal ( lacayo ); end ; process type begin phils ( i : Integer ); derecha ( i : derecha:=( i mod Integer ): N )+1 ; Integer ; izquierda ( i : Integer ): Integer ;

repeat begin pensar ( getforks comer( i putforks end forever ; end ; var var begin initial( lacayo , 4 ); initial ( imprimir , 1 ); for i:= 1 to n do initial ( horquillas [ i ], 1 ); cobegin for i:=1 to N do fil [ i ] ( i ); coend end. fil : array [ 1 .. N ] i : Integer ; of phils ; i ); ( i ); ); ( i );

Anda mungkin juga menyukai