Fonctionnement des conditions de l'interface pthread
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 :
Code:
1 2 3
| Attendre une condition (avec pthread_cond_wait)
Afficher un message
Se terminer |
Et la fonction principale du programme :
Code:
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 |
Mais voilà : le programme ne se déroule pas comme prévu, je tombe dans un deadlock.
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:
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 ;
} |