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 :

pthread_exit(void* ret) et pthread_join(thread, (void **)ret)


Sujet :

POSIX C

  1. #1
    Membre �clair�
    Profil pro
    �tudiant
    Inscrit en
    D�cembre 2007
    Messages
    630
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 630
    Par d�faut pthread_exit(void* ret) et pthread_join(thread, (void **)ret)
    Bonjour,
    j'aimerais savoir comment doit - on proc�der pour r�cuperer par l'int�rm�diaire de pthread_join(thread, val_ret) une valeur de retour envoy� par pthread_exit(val_ret). Dans mon cas la valeur � recuperer est un entier.

    Voici les syntaxes exactes:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    pthread_exit(void *retval);
    pthread_join(pthread th, void  **thread_return);
    Voici � peu pr�s ce que je dois faire ( est ce que c'est correcte ? )
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void *my_thread(void *vargp)
    {
        int retval = 42
        pthread_exit(&retval);
    }
    int main()
    {
        int *i;
        pthread_t tid;
        pthread_create(&tid, NULL, my_thread, NULL);
        pthread_join(tid, &i);
        printf("%d\n",i);
    }

    Merci d'avance pour votre aide

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    2 015
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 2 015
    Par d�faut
    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
    30
    31
    32
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
     
    static void * my_thread(void * vargp)
    {
       int * retval = malloc(sizeof *retval);
     
       if(retval != NULL)
       {
          *retval = 42;
       }
     
       pthread_exit(&retval);
    }
     
    int main(void)
    {
       int * i = NULL;
       pthread_t tid;
     
       pthread_create(&tid, NULL, my_thread, NULL);
       pthread_join(tid, (void**)&i);
     
       if(i != NULL)
       {
          printf("%d\n", *i);
          free(i), i = NULL;
       }
     
       return 0;
    }
    Cordialement.

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Tu as oubli� le free apr�s le printf...
    Et il faudra sans doute un cast lors de l'appel � pthread_join().

    Edit: Corrig� depuis.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    2 015
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 2 015
    Par d�faut
    Citation Envoy� par M�dinoc Voir le message
    Tu as oubli� le free apr�s le printf...

    Et il faudra sans doute un cast lors de l'appel � pthread_join().
    Et oui, voil� ce qu'il se passe quand on ne prend m�me pas la peine de compiler son code...
    Merci M�dinoc.

  5. #5
    Membre �clair�
    Profil pro
    �tudiant
    Inscrit en
    D�cembre 2007
    Messages
    630
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 630
    Par d�faut
    Voici le programme qui compile sans erreur ni warning et qui affiche bien la valeur voulue : 42

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
     
    static void * my_thread(void * vargp)
    {
      int *retval = malloc(sizeof retval);
     
       if(retval != NULL)
       {
         *retval = 42;
       }
       //pthread_exit(void *retval);
       pthread_exit(retval);
    }
     
    int main(void)
    {
       int * i = NULL;
       pthread_t tid;
     
       pthread_create(&tid, NULL, my_thread, NULL);
       // pthread_join(pthread thread,void **thread_return);
       pthread_join(tid,(void **) &i);
       printf("%d\n", *i);
       free(i);
       return 0;
    }
    Citation Envoy� par M�dinoc Voir le message
    Tu as oubli� le free apr�s le printf...
    Et il faudra sans doute un cast lors de l'appel � pthread_join().

    Edit: Corrig� depuis.
    - pourquoi doit on faire un cast lors de l'appel � pthread_join( ) ? Ne devrait - on pas le faire aussi dans pthread_exit( ) ...

    quand je fais ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    static void * my_thread(void * vargp)
    {
      int retval = 42; 
       //pthread_exit(void *retval);
       pthread_exit(&retval);
    }
    ca compile MAIS a l'execution ca ne donne pas 42, ca donne -1208470568 puis une erreur de segmentation � cause de free(i);

    - pourquoi obtient on -1208470568 au lieu de 42 ? pthread_exit( void *retval ) attends en param�tre l'adresse d'un int ( c'est ce que j'ai fait ), non ?

    Merci d'avance pour votre aide .

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Ao�t 2007
    Messages
    2 015
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2007
    Messages : 2 015
    Par d�faut
    Citation Envoy� par ikuzar Voir le message
    - pourquoi doit on faire un cast lors de l'appel � pthread_join( ) ? Ne devrait - on pas le faire aussi dans pthread_exit( ) ...
    Parce que pthread_join() attend en second param�tre un (void**) et qu'on lui passe un (int**).
    pthread_exit() n'en a pas besoin dans la mesure o� son argument est un pointeur g�n�rique (void*).

    Citation Envoy� par ikuzar Voir le message
    quand je fais ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    static void * my_thread(void * vargp)
    {
      int retval = 42; 
       //pthread_exit(void *retval);
       pthread_exit(&retval);
    }
    ca compile MAIS a l'execution ca ne donne pas 42, ca donne -1208470568 puis une erreur de segmentation � cause de free(i);

    - pourquoi obtient on -1208470568 au lieu de 42 ?
    Tu retournes une adresse sur la pile, le soucis c'est qu'au retour de ta fonction cette adresse n'a plus aucune signification, donc comportement ind�termin�. Voil� pourquoi je fais une allocation dynamique.

    Citation Envoy� par ikuzar Voir le message
    pthread_exit( void *retval ) attends en param�tre l'adresse d'un int ( c'est ce que j'ai fait ), non ?
    pthread_exit() prend en param�tre un pointeur g�n�rique, donc elle n'attend pas sp�cialement l'adresse d'un int, �a peut �tre l'adresse de n'importe quel objet. ton soucis, c'est que ton objet n'existe plus quand tu retournes dans ta fonction main().

Discussions similaires

  1. thread ->private void exit
    Par chabacano dans le forum Concurrence et multi-thread
    R�ponses: 0
    Dernier message: 03/06/2010, 19h13
  2. void (timer::)()' does not match `void (*) ?
    Par jahmanzaar dans le forum D�buter
    R�ponses: 5
    Dernier message: 23/10/2008, 16h49
  3. Utilisation de void**
    Par KORTA dans le forum C
    R�ponses: 6
    Dernier message: 05/09/2003, 19h52
  4. Manipulation de void*
    Par KORTA dans le forum C
    R�ponses: 17
    Dernier message: 02/09/2003, 22h39
  5. TRaduction C++ => Delphi VOID ??
    Par escafr dans le forum Langage
    R�ponses: 6
    Dernier message: 20/02/2003, 10h39

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