2009-08-30 9 views
65

J'ai besoin de passer plusieurs arguments à une fonction que je voudrais appeler sur un thread séparé. J'ai read que la manière typique de faire ceci est de définir une structure, passer la fonction un pointeur à cela, et déréférencer pour les arguments. Cependant, je ne peux pas obtenir ce travail:Plusieurs arguments à la fonction appelée par pthread_create()?

#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, je reçois effectivement:

141921115 
-1947974263 

Quelqu'un sait ce que je fais mal?

+1

essayer allouer sur le tas? –

+1

@Carson Pourquoi cela devrait-il faire la différence? – sigjuice

+5

Votre structure devrait vivre au moins aussi longtemps que votre fil. Si vous créez un thread et que vous revenez de la fonction appelée pthread_create(), la structure allouée sur la pile peut être écrasée par d'autres données et provoquer des problèmes dans la fonction de thread. Dans cet exemple, ce n'est pas un problème, car le thread de création attend que le thread de travail se termine avant de retourner. –

Répondre

58

Parce que vous dites

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

au lieu de

struct arg_struct *args = arguments;

+0

Wow. Duh. Merci. – Michael

+2

Me fait me demander comment il a compilé avec succès en premier lieu ... –

+2

@sigjuice, Cela ne fonctionne pas pour moi. Je vois une erreur de compilation: conversion invalide de 'void *' en 'arg_struct *'. – Neshta

4

main() a son propre fil et la pile des variables. soit allouer de la mémoire pour « args » dans le tas ou la rendre globale:

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

//declares args as global out of main() 

Alors bien sûr changer les références args->arg1-args.arg1 etc ..

15

utilisation

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

en place de

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

utilisation:

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

Et passer ce arguments comme celui-ci:

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

Ne pas oublier args gratuitement! ;)

0

Les args de print_the_arguments est des arguments, vous devez donc utiliser:

struct arg_struct *args = (struct arg_struct *)arguments. 
Questions connexes