probleme thread pthread_join

probleme thread pthread_join - C - Programmation

Marsh Posté le 16-02-2007 à 16:49:36    

Bonjour,
 
Je fais un program sous Cygwin utilisant des threads et ca marche pas. J'ai donc decide de faire le plus simple possible et ca marche toujours pas! J'utilise le code de Emmanuel Delahaye disponible sur son site (http://mapage.noos.fr/emdel/pthreads.htm) :

Code :
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. static void *task_a (void *p_data)
  4. {
  5.    puts ("Hello world A" );
  6.    (void) p_data;
  7.    return NULL;
  8. }
  9. static void *task_b (void *p_data)
  10. {
  11.    puts ("Hello world B" );
  12.    (void) p_data;
  13.    return NULL;
  14. }
  15. int main (void)
  16. {
  17.    pthread_t ta;
  18.    pthread_t tb;
  19.    puts ("main init" );
  20.    pthread_create (&ta, NULL, task_a, NULL);
  21.    pthread_create (&tb, NULL, task_b, NULL);
  22. #if 1
  23.    pthread_join (ta, NULL);
  24.    pthread_join (tb, NULL);
  25. #endif
  26.    puts ("main end" );
  27.    return 0;
  28. }


 
et ca me donne le resultat suivant:

Code :
  1. main init
  2. Hello world A


... comme si le pthread_join n'avait aucun effet... c est le meme probleme que ce que j ai dans mon code plus complique. Je n'y comprends plus grand chose alors toutes pistes serait la bienvenue!
 
merci

Reply

Marsh Posté le 16-02-2007 à 16:49:36   

Reply

Marsh Posté le 16-02-2007 à 17:46:09    

si ton programme est correctement compilé (-pthread) c'est juste que puts n'est pas threadsafe. Et sans doute pas l'appel système en dessous. Enfin je l'ai déjà constaté hors cygwin

Reply

Marsh Posté le 16-02-2007 à 18:07:34    

Taz a écrit :

si ton programme est correctement compilé (-pthread) c'est juste que puts n'est pas threadsafe. Et sans doute pas l'appel système en dessous. Enfin je l'ai déjà constaté hors cygwin


 
oui j'ai compile avec la ligne de commande gcc -lpthread -o test main.c (j'ai aussi essaye avec le -lpthread a la fin car je ne suis pas sure de la position mais ca ne change rien).
Meme si puts n'est pas threadsafe, j'aurais du avoir l'affichage de la 2eme thread ("Hello world B" ) non? Car j'ai mon pthread_join avant le puts. Normalement le main devrait donc attendre la fin de mes 2 threads avant d executer le puts non (j'ai enlever le premier puts("main inits" ) pour eliminer cet eventuel probleme).
Sinon qu'est ce que tu me conseil au lieu de puts qui serait threadsafe?

Reply

Marsh Posté le 16-02-2007 à 18:12:37    

compile avec -pthread et pas -lpthread

Reply

Marsh Posté le 16-02-2007 à 18:42:26    

Taz a écrit :

compile avec -pthread et pas -lpthread


 
C'est ce que j'avais mis au debut mais gcc me repond "gcc: unrecognized option -pthread" alors que je n ai pas ce problem avec -lpthread.

Reply

Marsh Posté le 16-02-2007 à 21:43:46    

bon tout ça est quand même suprenant

Reply

Marsh Posté le 19-02-2007 à 12:51:42    

Taz a écrit :

bon tout ça est quand même suprenant


 
oui je sais, mais a priori c'est a cause de Cygwin. J'ai essaye sous Linux ce week-end et j ai pas le meme probleme. Je ne suis pas sure de ce qui ne marche pas sous Cygwin.

Reply

Marsh Posté le 19-02-2007 à 13:39:23    

la sémantique POSIX de write est complexe en terme d'environnement threadé. La glibc essaie de faire un peu mieux mais a priori rien ne garantie pas grand chose. Dans l'absolue, il ne faudrait pas s'appuyer dessus. Tu peux faire un thread d'affichage avec une file d'attente. C'est propre et facile.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed