Hola a todos,
Yo llegue a otra solución de este ejercicio.
En
el momento no me avive de usar a favor el inicializar los semáforos no
binarios con un valor que me facilite los controles, así que me quedo
tal vez no tan simple..
Si alguien la quiere criticar, o le parece que algo está mal, le agradezco lo comente!.
Porque en estos ejercicios muchas veces nos parece que está bien y nos mandamos unas cuantas pifiadas.
Desde ya muchas gracias!!!.
SOLUCION:
Init(mutexTanque,1) ;
Init(esperaInspector,0) ; // cuando el inspector tiene que esperar para poder usar el tanque.
Init (esperaGeneradora, 0)// cuando la generadoras de liquido tengan que esperar para usar el tanque
init (esperaEmbotelladora,0) // cuando la embotelladoras de liquido tengan que esperar para usar el tanque
tanque = 0; // cantidad de liquido en el tanque.
hay_alguien = false; // hay alguna maquina trabajando en el tanque.
hayInspector = false; // el inspector esta esperando o esta usando el tanque.
generadoras = 0; // cantidad de generadoras esperando a poder usar el tanque.
embotelladoras = 0; // cantidad de embotelladoras esperando a usar el tanque.
WHILE (TRUE) {
p(mutexTanque);
hayInspector = true; // lo uso tanto para indicar que hay un inspector esperando como si esta trabajando en la zona critica.
if(hay_alguien){ // hay alguna maquina trabajando en la zona critica
v(mutexTanque);
p(esperaInspector) // espera a poder trabajar en la zona critica.
} else {
v(mutexTanque);
}
tomarMuestra(); // Aca se que no va haber nadie mas.
procesarSolucionar();
p(mutexTanque);
hayInspector = false; // marco que ya no voy estar en la zona critica
if(embotelladora>0 && tanque > 0){ // hay embotelladora y va poder llenar.
hay_alguien = true;
V(esperaEmbotelladora);
} else if(generadora>0 && tanque<100){ // hay generadora y va poder volcar lo que produjo.
hay_alguien = true; // le dejo prendida esta variable porque al despertar no lo va hacer.
V(esperaGeneradora)
}
v(mutexTanque);
otrasTareas();
}
}
void Generadora () {
WHILE (TRUE){
generarBebida();
p(mutex);
if(hay_alguien || hayInspector || tanque>100) {
generadoras++; // cantidad de generadoras que esperan para verter en el tanque.
V(mutexTanque);
P(esperaGeneradora); // luego de despertar no pone hayalguien en true porque ya el que desperto a esta maquina lo puso por ella.
} else{
hay_alguien = true;
V(mutexTanque);
}
descargarEnTanque();
tanque++;
P(mutexTanque);
if(hayInspector){
hay_alguien = false;
V(esperaInspector);
V(mutex);
} else if(embotelladora>0){
// le deja la variable hayalguien en true como ya lo tenia.
V(esperaEmbotelladora);
} else if(generadora>0 && tanque<100){ //hay esperando generadora y el tanque no esta vacio.
// le deja la variable hayalguien en true como ya lo tenia.
V(esperaGeneradora)
} else{
hay_alguien = false;
}
V(mutexTanque);
}
}
void embotelladora(){
WHILE (TRUE){
p(mutex);
if(hay_alguien || hayInspector || tanque == 0) {
embotelladoras++; // cantidad de generadoras que esperan para verter en el tanque.
V(mutexTanque);
P(esperaEmbotelladora);
} else{
hay_alguien = true;
V(mutexTanque);
}
llenarLata();
tanque--;
P(mutexTanque);
if(hayInspector){
hay_alguien = false;
V(esperaInspector);
} else if(generadora>0 ){ //Sabe que no va estar lleno porque ella saco.
// le deja la variable hayalguien en true como ya lo tenia.
V(esperaGeneradora)
}else if(embotelladora>0 && tanque>0){ // si hay quien quiere llenar y puede llenar.
// le deja la variable hayalguien en true como ya lo tenia.
V(esperaEmbotelladora);
} else{
hay_alguien = false;
}
V(mutexTanque);
}
}