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