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 : 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
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);
}