retomar bucle for con valores globales

Iniciado por d91, 2 Septiembre 2015, 16:56 PM

0 Miembros y 1 Visitante están viendo este tema.

d91

Hola a todos, estoy intentando simular el algoritmo dekker 1 (alternancia estricta), llamo al proceso 1, y su seccion_critica inicia el bucle for empieza corriendo bien pero al retomar el bucle for despues de la  primera interrupcion ya no lo realiza, el for deberia llegar a 7000 porque  aumento el acumulador de los procesos
Código (cpp) [Seleccionar]

struct PCB{
int id; //id del proceso
char nombre[16];//nombre
int tareas_iniciales; //duracion de las tareas iniciales
int duracion; //cuanto durara el proceso
int quantum; //contador de interrupciones
int acumulador;//valor antes de la interrupcion
};

PCB p1;
PCB p2;

void crear_procesos(){        /***********************************/
p1.id=1;                      //  RELLENA DATOS A LAS
strcpy(p1.nombre,"PWRDVD");   //  ESTRUCTURAS
p1.duracion=7000;             //  DE TIPO PCB
p1.quantum=0;                 //
p1.acumulador=0;              //                 //
p1.tareas_iniciales=2000;     //  P1 ES PARA PROCESO1
                              //
p2.id=2;                      //
strcpy(p2.nombre,"DVDRIPPER");//  P2 ES PARA PROCESO2
p2.duracion=7000;             //
p2.quantum=0;                 //
p2.acumulador=0;              //                  //
p2.tareas_iniciales=2000;     /*****************************/
}

int seccion_critica(int id){
cout<<"\nSeccion Critica: Proceso "<<id;
   if(id==1){
   for(int i=p1.acumulador; i<=p1.duracion; i=i+1000){
    p1.acumulador=i;
      if(i==3000||i==6000||i==9000){
         
         return 1;    /*** ENTRO AL BUCLE DEL QUANTUM ***/
         Sleep(2000);
         break;
    }  //if
   }//for
   }//if principal
   else{
       for(int i=p2.acumulador; i<=p2.duracion; i=i+1000){
            p2.acumulador=i;
    if(i==3000||i==6000||i==9000){
         
         return 1;        /*** ENTRO AL BUCLE DEL QUANTUM***/
         Sleep(2000);
         break;
    }  //if
   }//for
   }//else
   Sleep(2000);
}


la interrupcion se da a los 3000 lo cual si funciona, se interrumpe pero como es alternancia estricta regresa hacia la seccion_critica porque no ha terminado, en teoria la siguiente seria en 6000, pero despues de la primera interrupcion se vuelve a llamar a la sección critica del proceso 1 pero el ciclo for ya no hace nada solo se inicia en 3000 pero ya no sigue contando, aunque p1.duracion sigue siendo 7000, agradecere sus aportes

someRandomCode

Hmm, te hago una pregunta..
Lo estas haciendo con mutex y threads como el algoritmo de dekker implica verdad?
De ser asi, podrias postear el codigo entero para futuras referencias?

d91

es solo simulacion y no he utilizado threads, esto es  para comprender como se manejan las interrupciones y funcionamiento segun los algoritmos de dekker, al final encontre una solucion al problema
Código (cpp) [Seleccionar]
p1.acumulador=p1.acumulador+1000; al principio asignaba lo que tenia i pero no se porque razon no corria bien