Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problèmes avec les thread et les pointeurs

    22 octobre 2006 à 16:30:03

    Bonjour,
    voilà je dois réaliser un programme fonctionnant avec l'aide des thread de la manière suivante :

    - Un processus ( thread principal ) crée un thread
    - Ce thread reçoit un nombre en paramètre qu'il affichera à l'écran, à la fin de son traitement, il renvoit ce nombre multiplié par 2.
    - le thread principal attend la terminaison du thread "fils".
    - Une fois terminé, le thread principal doit afficher à l'écran le nombre renvoyé par le thread fils.

    La compilation passe. Ce qui est bizzare c'est que l'adresse retournée par le traitementTh1 et l'adresse reçue est la même. Ca doit coincer au niveau de ces deux lignes :

    retVal=*((int *)retValTh1);
    printf("\nValeur de la variable recu : %d\n", retVal);



    Voici mon code :


    void * traitementTh1(void * nbParamTh1);

    int main()
    {
            pthread_t idTh1;
            int errTh1, errAttenteTh1;
            int paramTh1; int retVal;
            void * retValTh1;

            // création du premier thread
            paramTh1=112;
            errTh1=pthread_create(& idTh1, NULL, traitementTh1, (void *) & paramTh1);
            if(errTh1!=0)
            { perror("Echec creation du premier thread"); exit(1); }


            // attente de la terminaison du premier thread
            errAttenteTh1=pthread_join(idTh1, &retValTh1);
            if(errAttenteTh1!=0)
            { perror("Echec attente terminaison thread 1"); exit(1); }
            else
            {
                    retVal=*((int *)retValTh1);
                    printf("\nValeur de la variable recu : %d\n", retVal);
            }
    }

    void * traitementTh1(void * nbParamTh1)
    {
            int nb, nbMult;

            // conversion du type en entier du paramètre
            nb=*((int *) nbParamTh1);
            printf("\nParametre du thread1 : %d \n", nb);

            nbMult=nb * 2;
            pthread_exit((void *) &nbMult);
    }


    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      22 octobre 2006 à 20:52:48

      Ton thread retourne l'adresse d'une variable locale .

      Il faut faire ainsi(non testé):


      void * traitementTh1(void * nbParamTh1);

      int main()
      {
              pthread_t idTh1;
              int errTh1, errAttenteTh1;
              int paramTh1; int retVal;
              void * retValTh1;

              // création du premier thread
              paramTh1=112;
              errTh1=pthread_create(& idTh1, NULL, traitementTh1, (void *) & paramTh1);
              if(errTh1!=0)
              { perror("Echec creation du premier thread"); exit(1); }


              // attente de la terminaison du premier thread
              errAttenteTh1=pthread_join(idTh1, &retValTh1);
              if(errAttenteTh1!=0)
              { perror("Echec attente terminaison thread 1"); exit(1); }
              else
              {
                      retVal=((int)retValTh1);// on cast vers int car ce n'est pas une adresse mais bien une valeur
                      printf("\nValeur de la variable recu : %d\n", retVal);
              }
      }

      void * traitementTh1(void * nbParamTh1)
      {
              int nb, nbMult;

              // conversion du type en entier du paramètre
              nb=*((int *) nbParamTh1);
              printf("\nParametre du thread1 : %d \n", nb);

              nbMult=nb * 2;
              pthread_exit((void *)nbMult);// On retourne l'entier et pas son adresse
      }


      A savoir que cette fois-ci on retourne un entier donc il faut le caster de (void *) vers int et inversement .
      • Partager sur Facebook
      • Partager sur Twitter

      Problèmes avec les thread et les pointeurs

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown