Il Barbiere Addormentato versione con Monitor type var
Il Barbiere Addormentato (versione con Monitor) type var salone = monitor poltronaoccupata, barbieredorme : boolean slibere : integer sedia, taglia, sveglia: condition procedure entry Avanti-il-prossimo begin if poltronaoccupata then begin if slibere < max then begin slibere : = slibere + 1 sedia. signal end else begin barbieredorme : = true sveglia. wait barbieredorme : = false end end
Procedure entry Si-Accomodi begin poltronaoccupata : = false taglia. signal end Procedure entry Vado-dal-Barbiere (var done: boolean) begin done : = true if (poltronaoccupata. OR. slibere < max ) then if slibere = 0 then done : = false else begin slibere : = slibere - 1 sedia. wait end if done then begin poltronaoccupata : = true if barbieredorme then sveglia. signal taglio. wait end begin pltronaoccupata: = false barbieredorme : = false slibere : = max end
Process Barbiere repeat begin Avanti-il-prossimo <taglia> Si-Accomodi end forever Process Cliente var done: boolean begin : Vado-dal-Barbiere (done) if done then <Cerco un altro barbiere> : end
Il Barbiere Addormentato (versione con RCC) var salone: shared record clienti : 0. . max (0) tagliofinito : boolean (false) Process Barbiere repeat region salone when ( clienti > 0) do begin clienti : = clienti - 1 end <taglia> region salone begin tagliofinito : = true end forever
Process Cliente var done: boolean begin : : region salone do begin if clienti < max then begin clienti : = clienti + 1 done : = true end else done : = false end if done then region salone when tagliofinito do begin tagliofinito : = false end : : end
Il Barbiere Addormentato (versione con RPC) Process salone var poltronalibera : boolean slibere : integer attesa: queue of process begin slibere : = N poltronalibera: =true do (poltronalibera. and. slibere < N); accept Avanti-il-prossimo (out client : process) do …. . od accept Vado-dal-barbiere (in client: process, out done: boolean) do …. . od accept Ho-finito (in client) do …. . od od end
accept Vado-dal-barbiere (in: client: process, out: done: boolean) do if slibere = 0 then done : = false else begin slibere : = slibere - 1 insert (client, attesa) done : = true end od accept Avanti-il-prossimo (out client : process) do begin slibere : = slibere+ 1 client: = first (attesa) poltronalibera: = false end od accept Ho-finito (in client) do begin client. Si-accomodi poltronalibera: = true end
Process Barbiere var cliente: process begin : repeat begin salone. Avanti-il-prossimo (var cliente) <taglia > salone. Ho-finito (cliente) end forever Process Cliente var done: boolean begin : salone. Vado-dal-barbiere (myname, done) if done then <Cerco un altro barbiere> else accept Si-Accomodi do od end
- Slides: 8