IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

Thread


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut Thread
    Bonjour,

    J'ai écrit un programme très simple qui construit 2 threads. Chacun appelle une fonction qui affiche la valeur passée en paramètre. En revanche je ne comprends pas pourquoi les deux threads affichent la parfois même valeur pour le paramètre. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    pthread_t pthread1, pthread2;
     
    void * f( int * i )
    {
    	printf("Param -> %d\n", *i);
    }
     
    int main( int argc, char ** argv )
    {
    	int i = 0;
    	pthread_create(&pthread1, NULL, (void *)f, &i);
    	i = 1;
    	pthread_create(&pthread2, NULL, (void *)f, &i);
     
    	pthread_exit(0);
     
    	return EXIT_SUCCESS;
    }
    Merci d'avance à ceux qui pourront m''aider pour pouvoir faire afficher un paramètre différent à chaque appel .


    Nico.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Thread
    Citation Envoyé par nicolas66
    J'ai écrit un programme très simple qui construit 2 threads. Chacun appelle une fonction qui affiche la valeur passée en paramètre. En revanche je ne comprends pas pourquoi les deux threads affichent la parfois même valeur pour le paramètre.
    Les données dont tu passes l'adresse aux threads doivent être partageables, donc statiques. Attention, ici, c'est la même variable. Si tu veux deux valeurs différentes, il faut des variables differentes

    Il faut respecter les prototypes des fonctions et éviter les transtypages abusifs ( (void*) ne convient pas pour un pointeur de fonction)

    En quittant, il faut attendre que les threads soient terminés. Eviter les sorties à la barbare...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include <pthread.h>
    #include <stdio.h>
     
    static void * f (void * p)
    {
       int *pi = p;
     
       if (pi != NULL)
       {
          printf("Param -> %d\n", *pi);
       }
    }
     
    int main (void)
    {
       static int i1 = 123;
       static int i2 = 456;
     
       pthread_t pthread1, pthread2;
     
       pthread_create (&pthread1, NULL, f, &i1);
       pthread_create (&pthread2, NULL, f, &i2);
     
       pthread_join (pthread1, NULL);
       pthread_join (pthread2, NULL);
     
       return 0;
    }
    Donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Param -> 123
    Param -> 456
    Un peu de lecture :

    http://emmanuel-delahaye.developpez.com/pthreads.htm

  3. #3
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    Pourquoi est-on obligé d'avoir deux variables différentes ? Et comment faire pour passer en paramètre de `pthread_create` l'indice d'une boucle for ou je créé mes threads ? Sinon pour le reste j'ai corrigé, merci .


    Nico.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par nicolas66
    Pourquoi est-on obligé d'avoir deux variables différentes ?
    Gné ? Faut demander à celui qui a écrit :
    faire afficher un paramètre différent à chaque appel
    Et comment faire pour passer en paramètre de `pthread_create` l'indice d'une boucle for ou je créé mes threads ?
    Ca n'a aucun sens.

    Un thread est un programme indépendant qui peut fonctionner comme ceci avec ses variables internes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void *thread (void *p)
    {
       T mydata = {0};
     
       <...>
     
     
       (void) p; /* p was ignored */
       return NULL;
    }
    ou avec une référence externe qui permet de l'identifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void *thread (void *p)
    {
       char const *s_id = p;
     
       if (s_id != NULL)
       {
          T mydata = {0};
     
          printf ("Hi, my name is %s\n", s_id);
     
          <...>
       }
       return NULL;
    }
    ou avec une référence externe + un contexte commun
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void *thread (void *p)
    {
       extT *p_ext = p;
     
       if (p_ext != NULL)
       {
          T mydata = {0};
     
          printf ("Hi, my name is %s\n", p_ext->s_id);
          printf ("Here is a common information %s\n", p_ext->p_shared->data);
     
          <...>
       }
       return NULL;
    }
    etc.

    C'est à toi de fournir les bonnes données au moment de la création des threads.

    Si tu veux qu'une information soit unique, elle doit être copié dans les données uniques du thread. Si tu veux qu'elle soit commune, elle doit être copiée dans les données partagées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct shared
    {
       T data;
    };
     
    typedef struct 
    {
       struct shared *p_shared;
       char const *s_id; /* etc. */   
    }
    extT;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo