Synchronisation et communication entre Thread
Bonjour;
Je rencontre un problème lors d'une implémentation d'une communication entre threads.
je souhaiterais faire communiquer un thread père ( ici le main) avec un thread fils. Lorsque le main crée un thread fils, il va attendre que le fils créé choisit une valeur aléatoire et qu'il lui renvoi via des pointeurs; il pourra alors à son tour choisir une valeur et l'envoyer également au fils.
" Schéma" de la communication:
fils créé;
père attend la valeur du fils;
fils choisit sa valeur, envoie un signal, et se met en attente;
père reçoit le signal, choisi sa valeur, envoie un signal aussi fils
Lorsque je compile le programme reste en attente, je pense que le problème vient du wait du fils car j'ai l'impression que le fils ne reçoit jamais le signal que lui envoie le père mais je ne comprends pas pourquoi. Avez- vous une idée d'où peut venir l'erreur?
Merci d'avance
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
|
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t mutx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cndx = PTHREAD_COND_INITIALIZER;
typedef struct {
pthread_mutex_t * mut;
pthread_cond_t * cnd;
int i;
int * val1;
int *val2;
} barriere_t;
void * thread (void * a) {
barriere_t * b = (barriere_t *) a;
pthread_mutex_lock (b->mut);
printf ("Entree pour le fils %d\n", b->i);
*b->val1=rand()%20; //le fils choisi une valeur
pthread_cond_signal (&cndx); //envoit un signal au pere pour dire qu'il a choisi une valeur
pthread_cond_wait (b->cnd, b->mut);//attend que le pere fini de choisir
printf ("La valeur choisi par le pere est %d\n", *b->val2); //affiche la valeur du pere
printf ("fin\n");
pthread_mutex_unlock (b->mut);
return NULL;
}
int main (){
srand(time(NULL));
int i;
pthread_t tid [3];
barriere_t bar [1];
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cnd = PTHREAD_COND_INITIALIZER;
int * null = malloc (sizeof (int) );
*null = -1;
for (i = 0; i < 1; ++i) {
pthread_mutex_lock (&mutx);
//initialisation des variables
bar [i] .mut = &mut;
bar [i] .cnd = &cnd;
bar [i] .val1 = null;
bar [i] .val2 = null;
bar [i] .i = i;
pthread_create (tid + i, NULL, thread, bar + i);
pthread_cond_wait (&cndx, &mutx);//attendre que le fils choisi une valeur
printf ("La valeur choisi par le fils est %d\n", *bar [i] .val1);
*null = rand()%20;//le pere choisi une valeur
bar [i] .val2 = null;
pthread_cond_signal (bar [i] .cnd);//envoit un signal au fils pour l'informer
pthread_mutex_unlock (&mutx);
}
for (i = 0; i < 1; ++i)
pthread_join (tid [i], NULL);
free (null);
} |