PROGRAM Cafeteria VAR nro_vendedor, nro_vendedor_inicial : integer mutex_inicial, salir_de_caja, entrar_a_caja, atender_caja, llega_cliente, mutex, cola_clientes, supervisor_disponible, comenzar_llenar_planilla : semaforo_no_binario PROCEDURE vendedor VAR ventas, mi_nro_v : integer //esto es para asignarle el nro de vendedor P(mutex_inicial) nro_vendedor_inicial = nro_vendedor_inicial + 1 mi_nro_v = nro_vendedor_inicial V(mutex_inicial) ventas = 0 while true do V(salir_de_caja) P(entrar_caja) //comienzo region critica caja P(atender_caja) P(llega_cliente) V(cola_clientes) recibir_pedido() V(atender_caja) cobrar_pedido() //la letra no dice nada de que no pueden haber 2 cobrando, si solo puede haber uno se mutuo excluye con otro semaforo cobrar_pedido() P(salir_caja) V(entrar_caja) //fin region critica caja ventas = ventas + 1 if ventas mod 10 = 0 then P(mutex) nro_vendedor = mi_nro_v P(supervisor_disponible) V(comenzar_llenar_planilla) end if elaborar_pedido() end while END vendedor PROCEDURE cliente V(llega_cliente) P(cola_clientes) enviar_pedido_pagar_y_recibir_pedido() END cliente PROCEDURE supervisor VAR nro_vendedor_copia : integer while true do P(comenzar_llenar_planilla) nro_vendedor_copia = nro_vendedor V(mutex) llenar_planilla(nro_vendedor_copia) V(supervisor_disponible) end while END supervisor BEGIN nro_vendedor_inicial = 0 init(mutex_inicial, 1) init(salir_de_caja, -1) init(entrar_a_caja, 2) init(atender_caja, 1) init(llega_cliente, 0) init(cola_cliente, 0) init(mutex, 1) init(comenzar_llenar_planilla, 0) init(supervisor_disponible, 2) COBEGIN vendedor;vendedor;vendedor;vendedor;vendedor;vendedor;vendedor;vendedor supervisor;supervisor cliente;... COEND