pthread_t pthread_join pthread_exit pthread_create pthread_attr_t pthread libreria c pthreads

pthread_join - MĂșltiples argumentos para funcionar llamados por pthread_create()?



pthread_exit (5)

Necesito pasar múltiples argumentos a una función a la que me gustaría llamar en un hilo separado. He read que la forma típica de hacerlo es definir una estructura, pasar la función un puntero a eso y desreferenciarlo para los argumentos. Sin embargo, no puedo hacer que esto funcione:

#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 */ }

El resultado para esto debería ser:

5 7

Pero cuando lo ejecuto en realidad obtengo:

141921115 -1947974263

¿Alguien sabe lo que estoy haciendo mal?


Los argumentos de print_the_arguments son argumentos, por lo que debe usar:

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


Porque tú dices

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

en lugar de

struct arg_struct *args = arguments;


Utilizar:

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

Y pasa estos argumentos de esta manera:

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

No te olvides de los args gratis! ;)


utilizar

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

en lugar de

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


main() tiene su propio hilo y variables de pila. ya sea asignar memoria para ''args'' en el montón o hacerlo global:

struct arg_struct { int arg1; int arg2; }args; //declares args as global out of main()

Luego, por supuesto, cambie las referencias de args->arg1 a args.arg1 etc.