Next: Lonja Online Up: Examen de Programación Concurrente Previous: Examen de Programación Concurrente

Subsecciones

- Solución propuesta

# Lonja Online [1 hora, 3 puntos]

En una subasta de pescado, el que subasta anuncia el lote de pescado que se va a subastar, junto con un precio de salida que será una cota superior del precio que realmente se va a pagar. Tras el anuncio inicial irá cantando precios cada vez menores hasta que alguno de los compradores puje, siéndole adjudicado el lote por el último precio cantado.1

La globalización también ha llegado a las subastas de pescado y se está diseñando un sistema para poder participar en ellas a través de Internet. Tras un primer análisis, se han identificado dos tipos de procesos, Vendedor y Comprador, cuyo comportamiento viene dado por el siguiente pseudocódigo:

    task body Vendedor is
      Adjudicado : Boolean := False;
      NuevoPrecio : Precio;
    begin
      <iniciar Lote>
      Gestor.IniciarSubasta(Lote.pescado, Lote.precio);
      loop
        <calcular NuevoPrecio>
        <esperar un cierto tiempo>
        Gestor.ActualizarPrecio(NuevoPrecio, Adjudicado);
        exit when Adjudicado;
      end loop;
    end Vendedor;
    task body Comprador is
      Ps : Pescado;
      Pr : Precio;
      NuevoPrecio : Precio;
      Concedido : Boolean := False;
      Hay : Boolean;
    begin
      Gestor.UnirseASubasta(Hay, Ps, Pr);
      if Hay and then <interesa Ps y Pr> then
        while not Concedido and Hay loop
          Gestor.OirValor(Pr,NuevoPrecio,Hay); Pr := NuevoPrecio;
          if Hay and then <queremos comprar> then
            Gestor.Pujar (Concedido, PrecioFinal)
          end if;
        end loop;
        if Concedido then
          <comprar lote>
        end if;
      end if;
    end Comprador;

Sólo habrá una instancia de Vendedor en ejecución y varias de Comprador. Como se puede ver, una característica fundamental del sistema es el escaso acoplamiento entre vendedor y compradores: aquél ignora cuántos compradores hay atendiendo a la subasta en un momento determinado y éstos ignoran si la subasta está o no abierta. La interacción con el gestor se ha pensado para que las operaciones proporcionen en todo momento esa información -- variables Hay, etc.

Las operaciones que el gestor ha de proporcionar son, pues, las siguientes:

    IniciarSubasta (Ps : in Pescado;
                    Pr : in Precio);
    -- Usada por el vendedor para notificar la apertura de una subasta

    UnirseASubasta (Hay : out Boolean;
                    Ps  : out Pescado;
                    Pr  : out Precio);
    -- Usada por un comprador para saber si la subasta está activa y,
    -- en tal caso, las características de lo subastado

    OirValor (PrecioAnterior : in  Precio;
              NuevoPrecio    : out Precio;
              Hay            : out Boolean);
    -- Usada por un comprador para conocer el nuevo precio
    -- ``Hay'' sirve para saber si la subasta sigue abierta

    Pujar (Concedido : out Boolean;
           Pr : out Precio);
    -- ``Concedido'' indica si la puja tuvo éxito y, si es así, ``Pr'' es el precio
    -- a que se ha adjudicado el lote (puede haber variado desde que se pujó).

    ActualizarPrecio (NuevoPrecio : in Precio;
                      Adjudicado  : out Boolean);
    -- La llama el vendedor, y pasa en ``NuevoPrecio'' el nuevo valor de la oferta.
    -- Si algún comprador ha pujado desde la última actualización,
    -- ``Adjudicado'' se hará cierto.

Un requisito que debe cumplir el sistema es la ausencia de bucles de espera activa, tanto en el vendedor como en los compradores. En el vendedor esto se consigue mediante una pequeña espera entre actualizaciones consecutivas del precio, pero en los compradores esto no es posible, ya que introducir retardos entre llamadas consecutivas a OirValor podría resultar en la pérdida de precios intermedios. Es, por tanto, responsabilidad del gestor el sincronizar las llamadas a OirValor para que los compradores no llamen varias veces sin haberse producido variación en el precio del pescado. En otras palabras, la llamada a OirValor no debe retornar hasta que no se haya producido una variación de precio con respecto al anterior que el comprador conocía -- de ahí la necesidad del parámetro de entrada PrecioAnterior.

Se pide:

1
  Especificar formalmente un CTADSOL GestorSubasta que permita realizar la interacción entre vendedor y compradores.[3 puntos]

## Solución propuesta

La solución propuesta es la especificación que se encuentra al principio de la siguiente parte del examen. Algunos comentarios sobre ella:

- Utilizar dos campos booleanos para llevar si la subasta está abierta y si se ha adjudicado no es incorrecto, pero se puede correr el riesgo de permitir que dos (o más) clientes diferentes pujen uno inmediatamente tras el otro, y el gestor asigne el lote a ambos. Es necesario prever este caso. Una sola variable salva esa situación.
- En Oir_Valor es necesario tener en cuenta que la subasta puede haber acabado. Varios clientes pueden estar bloqueados esperando un cambio de precio, y un cliente rezagado puede pujar por un precio más alto que el actual. Entonces la subasta terminaría sin que se baje el precio y por tanto sin que se desbloqueen aquellos que esperaban un cambio del mismo.

Next: Lonja Online Up: Examen de Programación Concurrente Previous: Examen de Programación Concurrente