Les threads en C sous linux !

Résolu
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008 - 29 mai 2006 à 15:17
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008 - 29 mai 2006 à 18:25
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

cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
29 mai 2006 à 16:22
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)
3
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
29 mai 2006 à 16:08
sleep(2) ==> Attend 2ms et non 2s !!!
Pour attendre 2 seconde c'est donc : sleep(2000).

Shell
0
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
29 mai 2006 à 16:24
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
0
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
29 mai 2006 à 16:25
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
29 mai 2006 à 16:26
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
0
cs_AlexN Messages postés 694 Date d'inscription lundi 5 décembre 2005 Statut Membre Dernière intervention 8 janvier 2014 19
29 mai 2006 à 16:30
Mais deathcrash a aussi raison on termine un thread avec pthread_exit()
c'est plus propre
0
ZedMaTrix Messages postés 178 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 14 août 2008
29 mai 2006 à 18:25
Grand Merci à vous tous !
Et surtout à AlexN !

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

ZedMaTriX
0
Rejoignez-nous