[ Foro de C ]

Espera activa (Hebras)

08-Jan-2020 16:54
bart ali
0 Respuestas

tengo este problema: Implementar un programa que obtenga M números primos utilizando 2 hebras trabajadoras y una coordinadora. Cuando una trabajadora está desocupada "pide” un número a la coordinadora. Si comprueba que es primo lo añade a un array compartido con la otra hebra trabajadora, en otro caso lo descarta. Cuando se hayan calculado los M números primos el programa debe acabar y mostrar por pantalla los números primos obtenidos.
espero que me ayuden y gracias de antemano.
#include <pthread.h>
#include <stdio.h>
#define M 10
#define tr 0
#define co 1


int array[M];
int num;
int fin=0;
int haynum=0;

int turnoTR=0;
int turnoTR_C=0;

int fTR[2]={0,0};
int fTR_C[2]={0,0};

int esprimo(int p){
int i,cnt=0;
for(i=1;i<=p;i++){
if(p%i==0){
cnt++;
}

}

if(cnt==2)
return 1;
else
return 0;
}

void *primo(void *argg){
int i=0,cnt=0;
int id=*(int *)argg;
int otro=(id+1)%2;

while(!fin){
// peterson entre trabajadoras
fTR[id]=1;
turnoTR=otro;
while(fTR[otro] && turnoTR==otro);
//peterson entre la trabajadora y la coordinadora
fTR_C[tr]=1;
turnoTR_C=co;
while(fTR_C[co] && turnoTR_C==co);

// seccion critica
if(esprimo(num)){
array[i]=num;
i++;
cnt++;

}
if(cnt==M){
   fin=1;
}
haynum=0;
fTR_C[tr]=0;
fTR[id]=0;

}

pthread_exit(NULL);

}

void *gen(void *argg){
int i=2;

while(!fin)){

fTR_C[co]=1;
turnoTR_C=tr;
while(fTR_C[tr] && turnoTR_C==tr);
if(!haynum){
num=i;
i++;
haynum=1;
   }
       fTR_C[co]=0;
}
pthread_exit(NULL);
}
int main(){
int i,id[2];
pthread_t tra[2],coor;

for(i=0;i<2;i++){
id[i]=i;
 pthread_create(&tra[i],NULL,primo,&id[i]);

   }
   
pthread_create(&coor,NULL,gen,NULL);
for(i=0;i<2;i++){
 pthread_join(tra[i],NULL);
   }
 pthread_join(coor,NULL);
 
for(i=0;i<M;i++){
printf(" %d ",array[i]);
}  
}




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)