132 votes

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 lu que le 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

Quelqu'un sait ce que je fais mal?

99voto

sigjuice Points 9166

Parce que tu dis

struct arg_struct *args = (struct arg_struct *)args;

au lieu de

struct arg_struct *args = arguments;

27voto

Akash Agrawal Points 840

utilisation

 struct arg_struct *args = (struct arg_struct *)arguments;
 

au lieu de

 struct arg_struct *args = (struct arg_struct *)args;
 

6voto

Plamen Panov Points 1

main() a ses propres variables de thread et de pile. allouez de la mémoire pour 'args' dans le tas ou rendez-le global:

 struct arg_struct {
    int arg1;
    int arg2;
}args;

//declares args as global out of main()
 

Ensuite, bien sûr, changez les références de args->arg1 à args.arg1 etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X