Plusieurs arguments à la fonction appelée par pthread_create()?

J'ai besoin de passer plusieurs arguments à une fonction que je voudrais appeler sur un thread séparé. J'ai lire que typique de la façon de le faire est de définir une structure (struct), passer à la fonction un pointeur, et de déréférencement pour les arguments. Cependant, je n'arrive pas à obtenir que cela fonctionne:

#include <stdio.h>
#include <pthread.h>

struct arg_struct {
    int arg1;
    int arg2;
};

void *print_the_arguments(void *arguments)
{
    struct arg_struct *args = (struct arg_struct *)args;
    printf("%d\n", args -> arg1);
    printf("%d\n", args -> arg2);
    pthread_exit(NULL);
    return NULL;
}

int main()
{
    pthread_t some_thread;
    struct arg_struct args;
    args.arg1 = 5;
    args.arg2 = 7;

    if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) {
        printf("Uh-oh!\n");
        return -1;
    }

    return pthread_join(some_thread, NULL); /* Wait until thread is finished */
}

La sortie de ce devrait être:

5
7

Mais quand je le lance j'ai réellement obtenir:

141921115
-1947974263

Ce que quelqu'un sait ce que je fais mal?

  • essayez de l'allocation sur le tas?
  • Pourquoi devrait-il faire une différence?
  • Votre structure doit vivre au moins aussi longtemps que votre fil. Si vous êtes à la création d'un thread et de retour de la fonction qui a appelé pthread_create(), la structure allouée sur la pile peut être écrasé par d'autres données et pourrait causer des problèmes dans votre fonction de thread. Dans cet exemple, ce n'est pas un problème, puisque la création de thread attend que le thread de travail à terminer avant de retourner.
  • Jaeger Oh! Merci à vous, c'est le problème que j'ai avec les autres, je travaillais avec. Je l'ai réparé par l'allocation sur le tas à l'aide de malloc(), comme Carson a dit. Que fait beaucoup plus de sens maintenant.
InformationsquelleAutor Michael | 2009-08-30