2010-09-29 4 views
1

Je suis novice en programmation multi-thread et j'ai une question à propos de pthreads.comportement de pthreads et de la fonction pthread_join

Ceci est le code de test que je cours et je ne comprends pas son comportement. Quelqu'un peut-il jeter un peu de lumière s'il vous plaît.

void *t1(void *args){ 
    printf("returning from t1\n"); 
    return; 
} 

void *t2(void *args){ 
    printf("returning from t2\n"); 
    return; 
} 

int main(){ 
    pthread_t thread1,thread2;  
    int r1,r2; 
    r1=pthread_create(&thread1,NULL,t1,NULL); 
    r2=pthread_create(&thread2,NULL,t2,NULL); 

    pthread_join(thread1,NULL);  
// pthread_join(thread2,NULL); 

    return 0; 
} 

Le comportement de ce programme est l'une des 5 indiqués ci-dessous

[email protected]:FFTW$ ./ptest 
returning from t2 
returning from t1 
[email protected]:FFTW$ ./ptest 
returning from t1 
returning from t2 
[email protected]:FFTW$ ./ptest 
returning from t1 
[email protected]:FFTW$ ./ptest 
returning from t2 
returning from t2 
[email protected]:FFTW$ ./ptest 
returning from t1 
returning from t2 
returning from t2 

Je ne comprends pas la 4ème et la 5ème sortie. Pourquoi le thread t2 s'exécute-t-il deux fois? Bien sûr, si je décommente pthread_join(&thread2,NULL,t2,NULL) le programme se comportera correctement mais je suis particulièrement intéressé par le cas où un seul thread rejoint le thread principal().

grâce, Mir

+0

Il nous manque du code? Vous avez "free (a)" et a ne semble pas être déclaré. – bramp

+0

ooops! Pardon! C'était une faute de frappe. Je l'ai corrigé. La question reste la même. – Mir

Répondre

1

Je crains que je ne suis pas en mesure de reproduire votre problème.

Je couru:

#include <pthread.h> 
#include <stdio.h> 

void *t1(void *args){ 
    printf("returning from t1\n"); 
    return NULL; 
} 

void *t2(void *args){ 
    printf("returning from t2\n"); 
    return NULL; 
} 

int main(){ 
    pthread_t thread1,thread2;  
    int r1,r2; 
    r1=pthread_create(&thread1,NULL,t1,NULL); 
    r2=pthread_create(&thread2,NULL,t2,NULL); 

    pthread_join(thread1,NULL);  
// pthread_join(thread2,NULL); 

    return 0; 
} 

Comme:

while (true) ; do ./ptest ; date ; done 

et repéré: t1, t2; t2, t1 et t1.

Mais jamais d'entrées répétées, ou t1 manquant.

Désolé.

Peut-être que votre librairie de threads a quelque chose de cassé ou d'impression à partir d'un processus fileté?

1

Il se peut que le thread t2 ne s'exécute PAS deux fois, mais la bibliothèque stdio imprime la sortie deux fois car il y a une condition de concurrence lorsque deux threads appellent printf() sans aucun verrouillage. Vous pouvez essayer de placer les appels à printf() à l'intérieur d'une paire pthread_mutex_lock()/pthread_mutex_unlock() (tous deux verrouillant le même mutex, bien sûr) et voir si cela provoque la disparition du symptôme.

+0

Je l'ai fait mais cela arrive encore, donc je suppose que la raison en est autre chose. – Mir

1

Je pense que vous voulez nous expliquer undefined comportement ici. Vous ne devez jamais utiliser une fonction de bibliothèque C après avoir quitté main(). Je pense que ce que vous voyez est le main() tampons de rinçage de fil alors qu'il est l'arrêt de la bibliothèque C. Je pense que cela pourrait ignorer les verrous de flux au moment où il se ferme.

+0

Je pense que votre explication pourrait être juste comme un pthread_join() pour thread2 ou même un sleep() dans main() se débarrasse du problème. – Mir

Questions connexes