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.
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.
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!
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