Bonjour,
J'essaye de faire un programme qui utilise 5 threads, ils lancent la fonction dodo, regardent dans quel ordre ils arrivent, endort tous les threads sauf le dernier puis celui-ci va réveiller un thread au hasard puis attendre. Le thread qui vient de se reveiller va en réveiller un autre puis attendre, ceci 15 fois.
J'arrive donc à faire cette manoeuvre mais quand j'arrive à la fin de ma boucle, je ne peux pas en sortir.
J'ai pourtant un while(i<15) et j'affiche i=16 à la toute fin du programme.
Voici le code de la fonction appelée par les threads.
bar et mut2 sont des variables globales.
Voici ce que j'ai à l'éxécution :
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 typedef struct { pthread_mutex_t mut; pthread_cond_t attend[5]; int tot; int deja; } barriere_t; barriere_t bar; int THREAD_EN_COURS; pthread_mutex_t mut2; void * dodo(void * thread) { int Ok=1; int i=1; int thread_en_cours,random; pthread_mutex_lock(&(bar.mut)); int valeur= *((int *)(thread)); printf("La thread numéro %d est arrivée en position %d\n",valeur,bar.deja); bar.deja++; if(bar.deja<=5) { pthread_cond_wait(&(bar.attend[bar.deja-2]),&(bar.mut)); } pthread_mutex_unlock(&(bar.mut)); pthread_mutex_lock(&mut2); while(Ok==1 && i<=15) { printf("valeur du thread : %d\n",valeur); if(i!=1) { printf("On reveille le thread numéro %d\n",valeur); } if(i<15) { do { random=rand()%5; } while(random==valeur); printf("random : %d\n",random); pthread_cond_signal(&(bar.attend[random])); pthread_cond_wait(&(bar.attend[valeur]),&(mut2)); } else Ok=0; i++; printf("Ok : %d \n", Ok); printf("i : %d \n",i); printf("Valeur finale : %d\n",valeur); } printf("LOL"); pthread_mutex_unlock(&mut2); return thread; }
La thread numéro 0 est arrivée en position 1
La thread numéro 1 est arrivée en position 2
La thread numéro 2 est arrivée en position 3
La thread numéro 3 est arrivée en position 4
La thread numéro 4 est arrivée en position 5
valeur du thread : 4
random : 3
valeur du thread : 3
random : 1
valeur du thread : 1
random : 2
valeur du thread : 2
random : 0
valeur du thread : 0
random : 3
Ok : 1
I : 2
Valeur finale : 3
valeur du thread : 3
On reveille le thread numéro 3
random : 0
Ok : 1
I : 3
Valeur finale : 0
valeur du thread : 0
On reveille le thread numéro 0
random : 1
Ok : 1
I : 4
Valeur finale : 1
valeur du thread : 1
On reveille le thread numéro 1
random : 2
Ok : 1
I : 5
Valeur finale : 2
valeur du thread : 2
On reveille le thread numéro 2
random : 4
Ok : 1
I : 6
Valeur finale : 4
valeur du thread : 4
On reveille le thread numéro 4
random : 1
Ok : 1
I : 7
Valeur finale : 1
valeur du thread : 1
On reveille le thread numéro 1
random : 2
Ok : 1
I : 8
Valeur finale : 2
valeur du thread : 2
On reveille le thread numéro 2
random : 0
Ok : 1
I : 9
Valeur finale : 0
valeur du thread : 0
On reveille le thread numéro 0
random : 4
Ok : 1
I : 10
Valeur finale : 4
valeur du thread : 4
On reveille le thread numéro 4
random : 3
Ok : 1
I : 11
Valeur finale : 3
valeur du thread : 3
On reveille le thread numéro 3
random : 1
Ok : 1
I : 12
Valeur finale : 1
valeur du thread : 1
On reveille le thread numéro 1
random : 0
Ok : 1
I : 13
Valeur finale : 0
valeur du thread : 0
On reveille le thread numéro 0
random : 1
Ok : 1
I : 14
Valeur finale : 1
valeur du thread : 1
On reveille le thread numéro 1
random : 2
Ok : 1
I : 15
Valeur finale : 2
valeur du thread : 2
On reveille le thread numéro 2
Ok : 0
I : 16
Valeur finale : 2
On arrive bien à ok=0 et I=16, pourtant je ne sors pas du while.
Merci de bien vouloir m'aider !
Partager