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