Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: d91 en 2 Septiembre 2015, 16:56 PM

Título: retomar bucle for con valores globales
Publicado por: d91 en 2 Septiembre 2015, 16:56 PM
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
Título: Re: retomar bucle for con valores globales
Publicado por: someRandomCode en 2 Septiembre 2015, 17:23 PM
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?
Título: Re: retomar bucle for con valores globales
Publicado por: d91 en 2 Septiembre 2015, 18:18 PM
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