2009-08-30 19 views
65

Necesito pasar múltiples argumentos a una función que me gustaría llamar en un hilo separado. Tengo read que la forma típica de hacer esto es definir una estructura, pasar la función un puntero a eso y desreferenciarlo para los argumentos. Sin embargo, no soy capaz de conseguir que esto funcione:Múltiples argumentos a la función llamados por 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 salida de este debe ser:

5 
7 

Pero cuando lo ejecuto De hecho, me sale:

141921115 
-1947974263 

Alguien sabe ¿Qué estoy haciendo mal?

+1

probar su asignación en el montón? –

+1

@ Carson ¿Por qué debería marcar la diferencia? – sigjuice

+5

Tu estructura debe vivir al menos tanto como tu hilo. Si está creando un hilo y regresando de la función que llamó a pthread_create(), la estructura asignada en la pila puede sobrescribirse por otros datos y podría causar problemas en su función de hilo. En este ejemplo, eso no es un problema, ya que el subproceso de creación espera a que se complete el subproceso de trabajo antes de volver. –

Respuesta

58

Debido a que usted dice

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

en lugar de

struct arg_struct *args = arguments;

+0

Wow. Duh. Gracias. – Michael

+2

Me hace preguntarme cómo compiló con éxito en primer lugar ... –

+2

@sigjuice, no funciona para mí. Veo el error de compilación: conversión inválida de 'void *' a 'arg_struct *'. – Neshta

4

main() tiene su propio hilo y apilar variables. o bien asignar memoria para args '' en el montón o que sea mundial:

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

//declares args as global out of main() 

Luego, por supuesto cambiar las referencias args->arg1-args.arg1 etc ..

15

uso

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

en lugar de

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

uso:

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

y pasar esta argumentos como este:

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

no se olvide args gratis! ;)

0

Los argumentos de print_the_arguments es argumentos, por lo que debe utilizar:

struct arg_struct *args = (struct arg_struct *)arguments. 
Cuestiones relacionadas