Bonjour!
Je travaille actuellement sur un projet : la simulation d'un bus CAN, en C. Pour ce faire, j'utilise des threads, qui sont coordonnés par des mutex (cf code). J'ai un problème pour coordonner 10 threads avec les données calculées dans un autre thread. Voici ce que j'ai fais (c'est juste une petite partie du programme, le reste n'a rien à voir avec ce problème, je ne met pas le main() non plus, ni les initialisations).
ces threads sont cencés se coordonner avec celui là :
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 pthread_cond_t var = PTHREAD_COND_INITIALIZER; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; for(i=0;i<10;i++) { k=i; if(pthread_equal(id,tid[i])) //création de 10 threads { //je fais des choses, les 10 threads font leurs calculs, une fois que ces calculs sont faits ils autorisent la création du thread n°13 (cf dessous) while(1) { pthread_mutex_lock(&mutex); pthread_cond_wait (&var, &mutex); pthread_mutex_unlock(&mutex); printf("\n je suis le node %d",k); } } }
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 if(pthread_equal(id,tid[13])) { while(1) { usleep(1000); time_since_beginning=time_since_beginning+1; // temps en ms if(time_since_beginning%10==0) //operateur modulo { printf("\nTIC"); pthread_mutex_lock (&mutex); pthread_cond_signal (&var); pthread_mutex_unlock (&mutex); } } }
Mon problème est que je voudrais que le programme se comporte de cette façon : à chaque fois que la variable time_since_beginning%10 arrive à 0, le programme affiche
etc... (l'ordre n'a pas d'importance tant qu'au final les 10 'je suis le node X' sont présents entre deux 'TIC')TIC
je suis le node 1
je suis le node 2
...
je suis le node 8
je suis le node 9
TIC
je suis le node 1
je suis le node 2
...
je suis le node 8
je suis le node 9
TIC
Mais ce qui se passe en réalité c'est que le programme affiche
....TIC
je suis le node 5
TIC
je suis le node 1
TIC
je suis le node 8
TIC
Je soupçonne très fortement que le problème est que seul un thread sur les 10 reçoit le signal 'var' qui permet de faire un tour de boucle. Ma question est donc la suivante : existe t-il un moyen pour que les 10 threads, et pas seulement 1, reçoivent le signal, et fassent ainsi tous un tour de boucle?
Merci d'avance
Partager