Necesito pasar varios argumentos a una función a la que me gustaría llamar en un hilo separado. He leído que la forma típica de hacer esto es definir una estructura, pasarle un puntero a la función y eliminar la referencia de 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 */
}
La salida para esto debería ser:
5
7
Pero cuando lo ejecuto, en realidad obtengo:
141921115
-1947974263
¿Alguien sabe lo que estoy haciendo mal?
Respuestas:
Porque tú dices
struct arg_struct *args = (struct arg_struct *)args;
en vez de
struct arg_struct *args = arguments;
fuente
utilizar
en lugar de
fuente
main()
tiene su propio hilo y variables de pila. asigne memoria para 'args' en el montón o hágalo global:Luego, por supuesto, cambie las referencias de
args->arg1
a,args.arg1
etc.fuente
Utilizar:
Y pase estos argumentos así:
¡No olvides los argumentos gratis! ;)
fuente
Los argumentos de print_the_arguments son argumentos, por lo que debes usar:
fuente
-> esta asignación es incorrecta, quiero decir que el argumento de la variable debe usarse en este contexto. ¡¡¡Salud!!!
fuente
En la creación del hilo de este código, se pasa la dirección de un puntero de función. El original
pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0
Debería leerse como
pthread_create(&some_thread, NULL, print_the_arguments, (void *) &args)
Una buena forma de recordar es que todos los argumentos de esta función deben ser direcciones.
some_thread
se declara estáticamente, por lo que la dirección se envía correctamente utilizando&
.Crearía una
pthread_attr_t
variable, luego la usaríapthread_attr_init()
y pasaría la dirección de esa variable. Pero, pasando unNULL
puntero también es válido.El
&
frente de la etiqueta de la función es lo que está causando el problema aquí. La etiqueta utilizada ya es unavoid*
una función, por lo que solo es necesaria la etiqueta.Decir
!= 0
con el argumento final parecería provocar un comportamiento indeterminado. Agregar esto significa que se pasa un booleano en lugar de una referencia.La respuesta de Akash Agrawal también es parte de la solución al problema de este código.
fuente
Tengo la misma pregunta que el póster original, Michael.
Sin embargo, intenté aplicar las respuestas enviadas para el código original sin éxito
Después de algunas pruebas y errores, aquí está mi versión del código que funciona (¡o al menos funciona para mí!). Y si observa de cerca, notará que es diferente a las soluciones publicadas anteriormente.
fuente