web-dev-qa-db-fra.com

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

Je dois passer plusieurs arguments à une fonction que je voudrais appeler sur un thread séparé. J'ai l que la manière typique de le faire est de définir une structure, de lui passer un pointeur et de le déréférencer pour les arguments. Cependant, je suis incapable d'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 */
}

Le résultat pour ceci devrait être:

5
7

Mais quand je le lance, je reçois réellement:

141921115
-1947974263

Quelqu'un sait ce que je fais mal?

82
Michael

Parce que tu dis

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

au lieu de

struct arg_struct *args = arguments;

68
sigjuice

utilisation

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

au lieu de

struct arg_struct *args = (struct arg_struct *)args;
16
Akash Agrawal

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..

4
Plamen Panov

Utilisation:

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

Et passez ces arguments comme ceci:

pthread_create(&tr, NULL, print_the_arguments, (void *)args);

N'oubliez pas les arguments gratuits! ;)

2
Elham

Les arguments de print_the_arguments sont des arguments, vous devriez donc utiliser:

struct arg_struct *args = (struct arg_struct *)arguments. 
0
Stone.Carton