2dor Parcial 2018 - Problema 3 - (Otra posible solucion con semaforos.)

2dor Parcial 2018 - Problema 3 - (Otra posible solucion con semaforos.)

de Maria Jose Yañez Dacosta -
Número de respuestas: 0

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.

void inspector() {

    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);
    }
}