practico 5 - ejercicio 11

practico 5 - ejercicio 11

de Usuario eliminado -
Número de respuestas: 6

Hola, dejo el código que implementamos para los que quieran comprar y/o intercambiar formas de hacerlo. 

Tenemos la duda en la parte de los procedimiento auxiliares del programa principal. 

Pusimos un COBEGIN - COEND para implementar el requerimiento: "El jefe de mesa deberá poder hacer las 2 funciones a la vez (pensar reordenamiento y reordenar con elegir carta y colocarla en mazo)." Es correcto? 

//procedimientos auxiliares del programa principal

procedure jugador()
begin
   pensar_jugada()
   tablero.puedojugar()
   jugar()
   tablero.terminejugar()
end

procedure jefedemesa()
begin
  while true
     cobegin
      begin
             pensar_reordenamiento();
             tablero.reordenar();
      end
       mazo.colocarcarta(elegircarta())
     coend
  end
end

Gracias. 

Saludos, Mariana

En respuesta a Usuario eliminado

Re: practico 5 - ejercicio 11

de Nicolas Tabare Tomeo Raspino -

A mi me pareció bastante bien. Algunos detalles que encontré, puede pasar que cuando se saque una carta en realidad el mazo este vacío (eso se soluciona devolviendo ESPERAR en ese caso dado que es lo que indica la letra que debe suceder en ese caso). Otro problema es que una vez que el mazo se llena el jefe pregunta constantemente  lo que te genera un busy waiting, se me ocurre solucionarlo bloqueando al jefe una vez que hay mas de 10 cartas y despertándolo cuando corresponda.
Finalmente otro detalle que encontré es que el jugador podría sacar la carta JUGAR cuando el Jefe no esta esperando para ordenar,sin embargo en la letra se plantea que debe ser en ese momento solamente en el cual se puede sacar carta.

En respuesta a Nicolas Tabare Tomeo Raspino

Re: practico 5 - ejercicio 11

de Usuario eliminado -

Nicolás, gracias por tu tiempo. 

Tenés razón, se me pasó lo del mazo vacío. 

Lo de busy waiting no lo veo, el jefe ejecuta una vez la sentencia "mazo.colocarcarta(elegircarta())" por que decís que se queda en busy waiting? 

En la sentencia "if ordenartablero and mazo.sacarcarta() = ESPERAR" 

asumí que si ordenartablero = FALSE ya sale del if y por lo tanto no va a sacar carta si es false, no es correcto eso? 

Saludos, Mariana

En respuesta a Usuario eliminado

Re: practico 5 - ejercicio 11

de Nicolas Tabare Tomeo Raspino -

Porque la sentencia mazo.colocarcarta(elegircarta()) está dentro de un while true. Por lo tanto lo que termina haciendo ese subproceso es polling, es decir consulta cada vez que tiene el procesador si la cantidad de cartas del mazo disminuyo y visto de otra forma lo que hace ese subproceso(digo subproceso porque está dentro de un cobegin-coend dentro de otro proceso) es esperar a que algún jugador saque una carta, de ahi el busy waiting, el problema es que esa espera consume procesador. En términos de eficiencia en uso de CPU  no es bueno tener ese polling ahora con respecto a la correctitud de la solución no se como te lo pueden tomar.

El otro detalle tal vez surge de mi interpretación de la letra. Yo había entendido que para jugar primero hay que sacar una carta. En tu código cuando ordenartablero = false el jugador va a jugar sin sacar carta.

En respuesta a Usuario eliminado

Re: practico 5 - ejercicio 11

de Kevin Quincke Ferreira -

Hola,

lo de busy waiting lo podes solucionar, como bien dijeron, trancando al jefe en una condition. Lo podes pensar si queres como una especie de productor-consumidor con un buffer limitado, cuando el buffer está lleno trancas con una condition y el proceso que estaba ejecutando en el monitor lo pierde. Y en caso que sacas una carta haces un signal, que podría perderse, indicando que hay lugar disponible. Yo ese lo hice así:

procedure sacarCarta(carta: out[ESPERAR,JUGAR]);
begin
       if cantCartas = 0 then
              carta:= ESPERAR
       else
              cantCartas:= cantCartas - 1;
              carta:= sacar_carta_de_mazo();
              mazolleno.signal;
       end;
end;

procedure colocarCarta(carta: in[ESPERAR, JUGAR]);
begin
        if cantCartas = 10 then
              mazolleno.wait;
        end;
        cantCartas:= cantCartas + 1;
        colocar_carta_en_mazo(carta);
end;

Por otra parte, yo interpreté creo que lo mismo de la letra, supuse que si no estaba el jefe de mesa entonces jugaban directamente, no se si estará bien.

Saludos!