2010-12-15 141 views
0

pthreads compilant j'ai essayé de compiler ce programme simple pthreads avec cette commandeproblème lorsque le programme

$ gcc -pthread -o pthreads pthreads.c 
#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 

void *myThread(void *arg); 

int main() 
{ 
    pthread_t mythread; 
    int ret; 

    ret = pthread_create(&mythread, NULL, myThread, NULL); 

    if (ret != 0){ 
     printf("Can't create pthread: %s", strerror(errno)); 
     exit(-1); 
    } 
    return 0; 
} 

void *myThread(void *arg){ 

    // Thread code goes here.. 
    printf("OK! NOW ON THE THREAD\n"); 
    pthread_exit(NULL); 
} 

mais en essayant ./pthreads il n'y a pas de sortie présenté !!

Répondre

6

Vous devez attendre la fin du fil. Sinon, vous risquez de quitter avant que le thread ne commence à s'exécuter.

... 
pthread_create(&mythread, NULL, myThread, NULL); 
... 
// Wait for the thread to finish. 
pthread_join(mythread, NULL); 
+0

thx homme, ça marche maintenant –

1

Vous n'avez pas attendu la fin de votre thread. Vous devez utiliser pthread_join().

1

Votre problème vient du fait que votre thread principal revient de main, et appelle donc exit (ou _exit). Tous les threads en cours sont supprimés lorsque le programme quitte. Dans ce cas, le thread de travail n'a pas eu le temps d'exécuter avant qu'il ne soit tué.

Vous pouvez utiliser pthread_join pour attendre l'achèvement du thread avant de revenir à partir de principal.

#include <stdio.h> 
#include <pthread.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 

void *myThread(void *arg); 

int main() 
{ 
    void* thread_return; 
    pthread_t mythread; 
    int ret; 

    ret = pthread_create(&mythread, NULL, myThread, NULL); 
    if (ret != 0) 
    { 
     printf("Can't create pthread: %s\n", strerror(errno)); 
     exit(-1); 
    } 

    ret = pthread_join(mythread, &thread_return); 
    if (ret != 0) 
    { 
     printf("Can't join pthread: %s\n", strerror(errno)); 
     exit(-1); 
    } 

    return 0; 
} 

void *myThread(void *arg) 
{ 
    printf("OK! NOW ON THE THREAD\n"); 
    pthread_exit(NULL); 
} 
1

réponse de Sanjit est certainement correct, mais par souci d'élargir votre boîte à outils de threads, vous pourriez aussi regarder pthread_barrier_wait. Lorsque vous avez un programme simple avec beaucoup de threads et main ressemble à "démarrer tous les threads de travail et attendre qu'ils finissent", avoir principal et tous les travailleurs simplement attendre sur une barrière peut être une bonne façon d'éviter d'avoir à stocker tous le thread de travail identifie et joint les dans une boucle for. Les barrières ont aussi beaucoup d'autres utilisations qui vous permettent parfois d'éviter la complexité inutile de faire les mêmes choses avec les mutex et les variables de condition.

+0

homme thx pour ça –