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.