Les threads en C sous linux ! [Résolu]

Signaler
Messages postés
178
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
14 août 2008
-
Messages postés
178
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
14 août 2008
-
Salut a tous !

Bien voila, je cherche a faire, pour le moment, des threads à qui j'en voie un nom différent pour chacun et ils me disent le nom qu'ils ont recu..

Prenons un exemple.
Imaginons que je veuille envoyer un nom de fichier avec cette syntaxe :
fichier1, fichier2, fichiern

J'ai donc ce code :

#include <stdio.h>
#include <string.h>
#include

// Tache qu'effectue les slots
void * new_thread(void * fichier)
{


        char test[50]="";

       

        strcpy(test, fichier);

       

        //Affiche le fichier

        printf("%s\n", test);

       

        //Attent 2secondes

        sleep(2);


        return(NULL);

       
}

int main ()
{


        pthread_t thread;       

       

        char fichierOr[]="fichier";

        char fichier[10]="";


        int i;

       

        for( i=0; i<20; i++ )

        {

       

                sprintf(fichier, "%s%d", fichierOr, i);

               

                printf("Le fichier en cours : %s\n", fichier);

       

                if(pthread_create(&thread, NULL, new_thread, (void *) fichier ))

                {

                                               

                        fprintf(stderr, "error creating a new thread \n");

                        return1;

                                               

                }else{

                       

                        printf("Slot créé.\n");

                       

                }

               

                                       

                pthread_detach(thread);

               

        }

       


        return0;
}

Mais mon soucis, c'est que j'obtient :

Le fichier en cours : fichier0


Slot créé.


Le fichier en cours : fichier1


Slot créé.


Le fichier en cours : fichier2


Slot créé.


Le fichier en cours : fichier3


Slot créé.


Le fichier en cours : fichier4


Slot créé.


Le fichier en cours : fichier5


Slot créé.


Le fichier en cours : fichier6


Slot créé.


Le fichier en cours : fichier7


fichier7


fichier7


fichier7


fichier7


fichier7


fichier7


fichier7


Slot créé.


Le fichier en cours : fichier8


Slot créé.


Le fichier en cours : fichier9


Slot créé.


Le fichier en cours : fichier10


Slot créé.


Le fichier en cours : fichier11


Slot créé.


Le fichier en cours : fichier12


Slot créé.


Le fichier en cours : fichier13


Slot créé.


Le fichier en cours : fichier14


fichier14


fichier14


fichier14


fichier14


fichier14


fichier14


fichier14


fichier14


Slot créé.


Le fichier en cours : fichier15


Slot créé.


Le fichier en cours : fichier16


Slot créé.


Le fichier en cours : fichier17


Slot créé.


Le fichier en cours : fichier18


Slot créé.


Le fichier en cours : fichier19


Slot créé.

Pourriez vous m'aider ???
ZedMaTriX

7 réponses

Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
14
Problème de pointeurs :

tu utilises toujours le même pthread_t pour tes pthread_create.
Il faut utiliser un tableau

Tu utilises toujours fichier, pour passer ta chaine
Il faut utiliser un tableau

#include <stdio.h>
#include <string.h>
#include

#define NTHREAD 20

// Tache qu'effectue les slots
void * new_thread(void * fichier)
{

        //Affiche le fichier
        printf("%s\n", (char *)fichier);
      
        return(NULL);
      
}

int main ()
{

        pthread_t thread[NTHREAD];      
      
        char fichierOr[]="fichier";
        char fichier[NTHREAD][10];

        int i;
      
        for ( i=0; i<NTHREAD; i++ )
        {
        //sleep(1);
      
                sprintf(fichier[i], "%s%d", fichierOr, i);
              
                printf("Le fichier en cours : %s\n", fichier[i]);
      
                if (pthread_create(&thread[i], NULL, new_thread, (void *) fichier[i] ))
                {
                                              
                        fprintf(stderr, "error creating a new thread \n");
                        return 1;
                                              
                } else {
                      
                        printf("Slot créé.\n");
                pthread_detach(thread[i]);
                      
                }
              
                                      
              
        }
        while (1);

        return 0;
}

Le while (1) sert à bloquer le thread main pour que tu ais le temps de tout voir
Parce que sinon il se termine avant la création de tes threads et tu ne les voit pas tous.
Si tu veux faire voir tout avec une pseudo synchro, tu décommentes sleep(1) et tu commentes le while(1)
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
sleep(2) ==> Attend 2ms et non 2s !!!
Pour attendre 2 seconde c'est donc : sleep(2000).

Shell
Messages postés
178
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
14 août 2008

Désolé DeAtHCrAsH.. Mais je suis sous linux, c'est un sleep s'exprime en secondes ..

Dixite : http://www.opengroup.org/onlinepubs/007908799/xsh/sleep.html

Mais merci pour ton intervension !

ZedMaTriX
Messages postés
178
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
14 août 2008

Alors là AlexN pour du boulot, c'est du boulot !!

Merci pour tes explications simple et clair !

Je teste ca tout a l'heure !! Merci !

ZedMaTriX
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Au fait, apparement tu t'es mal documenté sur l'utilisation des thread POSIX.
Essaye plutot ca :

#include <stdio.h>
#include <string.h>
#include

// Tache qu'effectue les slots
void * maRoutine(void * arg)
{
        char test[64];
        int *status = malloc (sizeof(int)); /* pour renvoyer le code de retour */
        
        strcpy(test, arg);
       
        //Affiche le fichier
        printf("%s\n", test);
       
        //Attent 2 milliseconde
        sleep(2);
         
        *status = *(int *)arg * 2; 
       
        pthread_exit (status); /*Quitte le thread en renvoyant le code retour - Utile pour savoir quel appel du thread en est le parent */     
}

int main ()
{
        pthread_t thread;       
       
        char fichierOr[]="fichier";
        char fichier[10]="";

        int i;
       
        for( i=0; i<20; i++ )
        { 
                sprintf(fichier, "%s%d", fichierOr, i);
                printf("Le fichier en cours : %s\n", fichier);
       
                if(pthread_create(&thread, NULL, maRoutine,  &i ))
                {                       
                        fprintf(stderr, "error creating a new thread \n");
                        return -1;  // Négatif car code erreur (convention)                         
                }else{
                        printf("Slot créé.\n");    
                }
                     
                //pthread_detach(thread);        
        }      

        return0;
}

Shell
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
14
Mais deathcrash a aussi raison on termine un thread avec pthread_exit()
c'est plus propre
Messages postés
178
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
14 août 2008

Grand Merci à vous tous !
Et surtout à AlexN !

Vous m'avez retirez une épine du pied !!  ;)

ZedMaTriX