Je dois passer plusieurs arguments à une fonction que je voudrais appeler sur un thread séparé. J'ai l que la manière typique de le faire est de définir une structure, de lui passer un pointeur et de le déréférencer pour les arguments. Cependant, je suis incapable d'obtenir que cela fonctionne:
#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 */
}
Le résultat pour ceci devrait être:
5
7
Mais quand je le lance, je reçois réellement:
141921115
-1947974263
Quelqu'un sait ce que je fais mal?
Parce que tu dis
struct arg_struct *args = (struct arg_struct *)args;
au lieu de
struct arg_struct *args = arguments;
utilisation
struct arg_struct *args = (struct arg_struct *)arguments;
au lieu de
struct arg_struct *args = (struct arg_struct *)args;
main()
a ses propres variables de thread et de pile. allouez de la mémoire pour 'args' dans le tas ou rendez-le global:
struct arg_struct {
int arg1;
int arg2;
}args;
//declares args as global out of main()
Ensuite, bien sûr, changez les références de args->arg1
à args.arg1
etc..
Utilisation:
struct arg_struct *args = malloc(sizeof(struct arg_struct));
Et passez ces arguments comme ceci:
pthread_create(&tr, NULL, print_the_arguments, (void *)args);
N'oubliez pas les arguments gratuits! ;)
Les arguments de print_the_arguments sont des arguments, vous devriez donc utiliser:
struct arg_struct *args = (struct arg_struct *)arguments.