Bonjour, j'utilise des threads dans mon prgm et je pense que mon prgm me retourne une mauvaise valeur à cause d'un pointeur.
Voici une partie de mon code :
La fonction CVode modifie mon vecteur pInteg->y
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 typedef struct { CVodeMem cvode_mem; N_Vector y; double t; double tout; unsigned int numpar; double rpm6; } Integ; void CreateInteg(void * cvode_mem,N_Vector y,double t,double tout,unsigned int numpar,double rpm6,Integ * integ) { integ->cvode_mem=(CVodeMem) cvode_mem; integ->y=y; integ->t=t; integ->tout=tout; integ->numpar=numpar; integ->rpm6=rpm6; } void * Integration(void * p) { if(p==NULL) { fprintf(stderr,"Error in %s %u : p == NULL\n",__FILE__,__LINE__); exit(EXIT_FAILURE); } else { Integ * pInteg=(Integ * ) p; CVodeMem pcvode_mem=pInteg->cvode_mem; /* Call CVode and test for error */ int flag = CVode(pInteg->cvode_mem, pInteg->tout,pInteg-> y, &pInteg->t,CV_NORMAL); if (check_flag(&flag, "CVode", 1)) { fprintf(stderr,"Error in %s : %d : CVode failed at theta = %g for the particle %d\nExit program\n",__FILE__,__LINE__,pInteg->rpm6*pInteg->t-180.,pInteg->numpar); exit(EXIT_FAILURE); } return NULL; } }
Puis dans mon main, j'ai la chose suivante
Mon pb vient que mon solveur me renvoie une erreur car il n'y a pas de convergence. Mais je pense que le pb n'est pas là car si je mets la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 pthread_t task[N]; Integ * integ=malloc(N*sizeof(*integ)); if(integ==NULL) { MEMERROR; exit(EXIT_FAILURE); } while(tout<tfin) { for(i=0;i<N;++i) /* loop on particles */ { CreateInteg(cvode_mem[i],y[i],t[i],ttout[i],i,e->rpm6,&integ[i]); pthread_create(&task[i], NULL, Integration, &integ[i]); t[i]=tout; } /* end of for(i=0;i<N;++i) */ for(i=0;i<N;++i) pthread_join (task[i], NULL); /**** Turbulence *****/ for(j=0;j<neq;++j) { aux3=0.; for(k=0;k<N;++k) aux3+=Ith(y[k],j); for(k=0;k<N;++k) Ith(y[k],j)=Ith(y[k],j)*aux1+aux3*aux2; }
à l'intérieur de ma boucle for(i=0;i<n;++i) (la 1e boucle), ce qui revient donc à faire un prgm séquentiel, le solveur me renvoie une solution correcte. Donc je pense que le pb doit provenir de mes threads.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 pthread_join (task[i], NULL);
Etant donné que je dois résoudre N équations différentielles, j'ai fait un tableaux de N solveur (avec un malloc) afin de ne pas avoir de variable communes aux différents solveur. C'est pourquoi je n'ai pas mis de mutex dans ma fonction integration.
Pour pouvoir effectuer ma "turbulence" je dois nécesairement avoir résolu avant mes N équations différientielles. Est-ce que pthread_join() suffit ou dois-je utiliser des mutex avec conditions ?
J'espère avoir été suffisament clair dans mes explications.
Partager