Threads et Mutex, Impossible de sortir d'une boucle while
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.
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
|
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;
} |
Voici ce que j'ai à l'éxécution :
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 !