Bonjour,
J'ai un soucis de compréhension quant-à l'usage des conditions de l'interface pthread.
À ce que j'ai compris, le fonctionnement est proche des sémaphores, sauf qu'il existe une fonction broadcast pour libérer l'ensemble des threads en attente.
J'essaie donc de mettre en œuvre l'algorithme suivant, mais cela ne fonctionne pas.
Voici en pseudo-code la fonction thread :
Et la fonction principale du programme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Attendre une condition (avec pthread_cond_wait) Afficher un message Se terminer
Mais voilà : le programme ne se déroule pas comme prévu, je tombe dans un deadlock.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Créer n threads devant exécuter la fonction ci-dessus Envoyer un signal général informant que la condition est respectée (avec pthread_cond_broadcast) Attendre la terminaison des n threads (avec pthread_join) Se terminer
Je pensais que :
- Dans le cas où un thread se met en attente de signal, il se débloque lorsqu'il le reçoit avec broadcast.
- Dans le cas où le broadcast a lieu avant la mise en attente du thread, celui-ci ne se bloque pas.
Mais apparemment ce n'est pas le cas. Quelqu'un peut-il donc m'éclairer sur ce qui ne vas pas ?
Merci d'avance.
Si besoin voici l'implémentation C que j'utilise :
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 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #define NB_THREADS 10 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER ; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER ; void* bonjour (void* pdata) { pthread_cond_wait (&cond, &mutex) ; printf ("Message du thread %ld\n", (long) pdata) ; pthread_exit (NULL) ; } int main (int argc, char** argv) { long i ; pthread_t t [NB_THREADS] ; for (i = 0 ; i < NB_THREADS ; i++) pthread_create (&t [i], NULL, bonjour, (void*) i) ; pthread_cond_broadcast (&cond) ; for (i = 0 ; i < NB_THREADS ; i++) pthread_join (t [i], NULL) ; return 0 ; }
Partager