primos mediante espera activa con hebras
Publicado por bart (3 intervenciones) el 08/01/2020 17:02:13
hola, tengo este problema que no consigo resolver.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.
gracias por su ayuda.
gracias por su ayuda.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#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]);
}
}
Valora esta pregunta


0