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