2013-06-09 4 views
0

J'utilise MINGW dans mon ordinateur Windows 7 pour le codage de thread POSIX.Les 2 premiers threads ne sont pas exécutés si je crée des threads dans une boucle

Tenir compte du code simple suivant:

#include <stdio.h> 
#include <pthread.h> 
#include <process.h> 
#define NUM_THREADS 5 

void *PrintHello(void *threadid) 
{ 
    long tid; 
     tid = (long)threadid; 
    printf("Hello Dude...!!!\t I am thread no #%ld\n",tid); 
    pthread_exit(NULL); 
} 
int main() 
{ 
    pthread_t thread[NUM_THREADS]; 
    int rc; 
    long t; 
    for(t=0;t<NUM_THREADS;t++) 
    { 
     printf("Inside the Main Thread...\nSpawning Threads...\n"); 
     rc=pthread_create(&thread[t],NULL,PrintHello,(void*)t); 
     if(rc) 
     { 
      printf("ERROR: Thread Spawning returned code %d\n",rc); 
      exit(-1); 
     } 
    } 
    return 0; 
} 

programme ci-dessus lorsqu'il est exécuté dans mon système, il montre la sortie suivante:

Inside the Main Thread... 
Spawning Threads... 
Inside the Main Thread... 
Spawning Threads... 
Hello Dude...!!!   I am thread no #0 
Inside the Main Thread... 
Spawning Threads... 
Hello Dude...!!!   I am thread no #1 
Inside the Main Thread... 
Spawning Threads... 
Hello Dude...!!!   I am thread no #2 
Inside the Main Thread... 
Spawning Threads... 

Ce programme était censé engendrer 5 fils. Mais il avait créé seulement 2 threads. La première ligne 2 et la dernière 2 suggère que la routine pthread_create() est sur le point d'être appelée. Et puisque la variable "rc" n'est pas "1", il n'y a aucune erreur dans la création du thread, sinon elle aurait atteint la partie "if (rc)".

Alors où est l'erreur? Ou c'est quelque chose lié à ma machine Windows.

Répondre

0

En fait, le vrai problème est que votre programme se termine lorsque votre principal se termine. Vous devriez pthread_join à eux avant de revenir de main. Les autres threads n'ont tout simplement pas une chance de s'exécuter avant les sorties principales, prenant tout l'espace de processus (et vos threads non exécutés) avec lui.

for(t=0;t<NUM_THREADS;t++) 
{ 
    printf("Inside the Main Thread...\nSpawning Threads...\n"); 
    rc=pthread_create(&thread[t],NULL,PrintHello,(void*)t); 
    if(rc) 
    { 
     printf("ERROR: Thread Spawning returned code %d\n",rc); 
     exit(-1); 
    } 
} 

/* add this and you're golden! */ 
for(t=0; t<NUM_THREADS;t++) { 
    pthread_join(thread[t], NULL); 
} 

Ci-dessous était ma réponse originale et toujours un bon conseil:

ne passent pas longtemps vide *. Passez l'adresse de celui-ci. Si vous en avez besoin, faites-en une copie à chaque fois dans la boucle pour la transmettre et la libérer plus tard.

long thread_data[NUM_THREADS]; 
for(t=0;t<NUM_THREADS;t++) 
    { 
     thread_data[t] = t; 
     printf("Inside the Main Thread...\nSpawning Threads...\n"); 
     rc=pthread_create(&thread[t],NULL,PrintHello,(void*)&(thread_data[t])); 
     if(rc) 
     { 
      printf("ERROR: Thread Spawning returned code %d\n",rc); 
      exit(-1); 
     } 
    } 
+0

J'avais changé le long à int mais encore le premier thread ne se fait pas exécuter ... – Shantanu

+0

Merci cela a fonctionné ... – Shantanu

1

Il n'y a pas d'erreur.

Votre programme se termine avant que les autres threads aient eu la possibilité de générer quoi que ce soit, et la sortie de votre programme tue tous ses threads.

Vous aurez besoin de pthread_join tous vos threads si vous voulez qu'ils se terminent correctement.

+0

Je suis nouveau à threading pouvez-vous me suggérer les changements ... – Shantanu

+0

S'il vous plaît chercher 'pthread_join ', vous trouverez beaucoup d'informations et d'exemples de comment vous êtes censé faire cela. Appelez simplement 'pthread_join' sur chacun des threads engendrés dans une seconde boucle dans votre main. – Mat

+0

Merci, ça a marché ... – Shantanu

Questions connexes