Exámen Marzo 2013 - Mailbox

Exámen Marzo 2013 - Mailbox

de Emiliano Torrano Barbe -
Número de respuestas: 3
Exámen:https://www.fing.edu.uy/inco/cursos/sistoper/examenes/2013/Sol2013MAR.pdf
El cajero está implementado de la siguiente forma:

procedure cajero()
var botella: Botella;
ticket: Ticket;
begin
  cajero_atender.send(NIL);
  loop
   cajero_cobrar.receive(botella);
   ticket := retornar_ticket(botella);
   cajero_ticket.send(ticket);
  end
end

En mi solución en vez de bloquear a los Miembros con "cajero_atender" se bloquean esperando la confirmación del Cajero y queria saber si está bien planteado de la siguiente manera:

procedure cajero()
var botella: Botella;
begin
loop
   quiero_pagar.receive(botella);
   PAGAR.send(NIL); //confirmación al miembro de que puede pagar
   obtener_ticket.receive(msg);
   ticket.send(retornar_ticket(botella));
end
end

Saludos

En respuesta a Emiliano Torrano Barbe

Re: Exámen Marzo 2013 - Mailbox

de Jorge Merlino -

Faltaría saber que hacen los clientes. Si hacen

quiero_pagar.send(botella);
pagar.receive(nil);
ticket.receive(ticket);

tengo dos comentarios. Primero que no se para que sirve el mailbox pagar y segundo que en ese caso se te pueden mezclar los tickets. Nadie garantiza que los clientes reciban los tickets en el mismo orden que enviaron las botellas. Esto está garantizado en la solución mediante la mutuexclusión que genera el mailbox cajero_atender.

En respuesta a Jorge Merlino

Re: Exámen Marzo 2013 - Mailbox

de Emiliano Torrano Barbe -

En realidad el código del Cliente cuando se comunica con el cajero es el siguiente:

(..)
quiero_pagar.send(botella); pagar.receive(nil);
pagar_vino(botella);
dame_ticket(nil);
ticket.receive(ticket);
(..)

En ésta solución,a mi entender, los clientes piden permiso para pagar al cajero con "quiero_pagar.send(botella);"
y queda esperando la habilitación en "pagar.receive(nil);".
El cajero atiende la solicitud con "quiero_pagar.receive(botella);" y habilita con "pagar.send(NIL);".
El problema está en que el cajero deposita el ticket en el mailbox "ticket" y cabe la posibilidad de que habilite a otro cliente y
éste segundo cliente realice un receive llevándose el ticket del cliente anterior.
Esto se podría solucionar con un arreglo de mailbox (ticket[1..15]) teniendo uno para cada cliente?
Con esto cada ticket quedaría en su respectivo mailbox.


Saludos
En respuesta a Emiliano Torrano Barbe

Re: Exámen Marzo 2013 - Mailbox

de Jorge Merlino -

Tenés el mismo problema en el mailbox pagar porque también podrían desordenarse los clientes ahí. Una posibilidad sería tener 15 mailboxes ticket y 15 mailboxes pagar pero es más fácil usar un mailbox solo para mutuoexcluir como en la solución.