Synchronisation entre Thread
Bonjour,
Je dispose de deux Thread qui font de simple calcules et renvoi leurs résultats au main.
Le problème survient lors de la création des Thread
Code:
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
|
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
typedef struct str {
int a;
int b;
int c;
float d;}parametre;
void *fils1(void *valeur){
parametre *val=(parametre *)malloc(sizeof(parametre));
val=valeur;
int a=val->a;
int b=val->b;
float d=val->d;
float *x1=malloc(sizeof *x1);
*x1=(-b-sqrt(d))/(2*a);
//printf("\nThread1: Solution 1 trouvée = %f\n",*x1);
//printf("la valeur de x1 %f\n",*x1);
pthread_exit(x1);
}
void *fils2(void* valeur){
parametre *val=(parametre *)malloc(sizeof(parametre));
val=valeur; /*le cast se fait implicitement*/
int a=val->a;
int b=val->b;
float d=val->d;
float *x2=malloc(sizeof *x2);
*x2=(-b+sqrt(d))/(2*a);
//printf("la valeur de x2 %f\n",*x2);
pthread_exit(x2);
}
int main(){
float d,x1,x2;
pthread_t p1,p2;
int val;
float *sauv1=NULL;
float *sauv2=NULL;
parametre *valeur=(parametre *)malloc(sizeof(parametre));
while(1){
printf("Donner la valeur de a\n");
scanf("%d",&valeur->a);
printf("Donner la valeur de b\n");
scanf("%d",&valeur->b);
printf("Donner la valeur de c\n");
scanf("%d",&valeur->c);
valeur->d=(valeur->b*valeur->b)-(4*valeur->a*valeur->c);
printf("D=%f\n",valeur->d);
if((valeur->d)>=0){
pthread_create(&p1,NULL,*fils1,valeur);
pthread_create(&p2,NULL,*fils2,valeur);
pthread_join(&p1,(void**)&sauv1);
pthread_join(&p2,(void**)&sauv2);
/*solution1=(float)sauv1;
solution2=(float)sauv2;
*/
printf("La Solution 1 X1= %f\nLa Solution 2 X2= %f\n",*sauv1,*sauv2);
}
else{
printf("Pas de Solution\n");
}
free(sauv1);
free(sauv2);
}
return 0;
} |
Console:
Donner la valeur de a
1
Donner la valeur de b
2
Donner la valeur de c
1
D=0.000000
Erreur de segmentation