Práctico 5 Ejercicio 4 parte b

Práctico 5 Ejercicio 4 parte b

de Matias Cadepont Burgos -
Número de respuestas: 3
Buenas tardes, quisiera saber si esta solución que adjunto es válida para el problema del ejercicio 4 con monitores.
Se que es mas "rebuscada" que la que se planteó en el prático, pero cuando consulté con el docente me recomendó que el avanzar_cinta() idealmente debería quedar fuera del monitor.

Desde ya gracias.

Saludos.


En respuesta a Matias Cadepont Burgos

Re: Práctico 5 Ejercicio 4 parte b

de Gabriel Gustavo Sosa Nieto -

Lo acabo de ver y para mi esta bien a menos del problema que te genera alternancia: primero llenas y después tapas.

Cambiando:

if (puedo_llenar()){

    Llenar.signal;

    DormirCinta.wait;

}

if (puedo_tapar()){

    Tapar.signal;

    DormirCinta.wait;

}


Por:

if (puedo_llenar() && puedo_tapar()){

    Llenar.signal;

    Tapar.signal;

    DormirCinta.wait;

    DormirCinta.wait;

}else if (puedo_llenar()){

    Llenar.signal;

    DormirCinta.wait;

}else if (puedo_tapar()){

    Tapar.signal;

    DormirCinta.wait;

}


Creo que así te quedaría bien.

En respuesta a Gabriel Gustavo Sosa Nieto

Re: Práctico 5 Ejercicio 4 parte b

de Matias Cadepont Burgos -

Tenes razón, si bien la cinta no avanza, espera a que termine de llenar para despues tapar cuando pueden hacer las dos cosas a la vez.

Gracias!

En respuesta a Matias Cadepont Burgos

Re: Práctico 5 Ejercicio 4 parte b

de Gustavo Brown -

La idea es que las funciones puedo_llenar y puedo_tapar sólo pueden ser ejecutadas por los procesos Llenador y Tapador.

La tarea auxiliar cinta de tu solución no deberia llamar a esos procedimientos.

Este problema con monitores se puede resolver sin utilizar tarea auxiliar.

La solución que planteas además tiene deadlock. Ej: Maquina_llenar detecta que no puede llenar, en ese punto pierde el procesador; la cinta avanza hasta que hay una botella debajo de la boca de llenado. Ahi cinta manda un Llenar.signal() que se pierde porque nadie hizo el wait y la cinta luego se bloquea en DormirCinta, luego toma el control la máquina de llenar hace un Llenar.wait() y se queda en deadlock.

Saludos,
  Gustavo