Plusieurs arguments à la fonction appelée par pthread_create()?
J'ai besoin de passer plusieurs arguments à une fonction que je voudrais appeler sur un thread séparé. J'ai lire que typique de la façon de le faire est de définir une structure (struct), passer à la fonction un pointeur, et de déréférencement pour les arguments. Cependant, je n'arrive pas à 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 */
}
La sortie de ce devrait être:
5
7
Mais quand je le lance j'ai réellement obtenir:
141921115
-1947974263
Ce que quelqu'un sait ce que je fais mal?
- essayez de l'allocation sur le tas?
- Pourquoi devrait-il faire une différence?
- Votre structure doit vivre au moins aussi longtemps que votre fil. Si vous êtes à la création d'un thread et de retour de la fonction qui a appelé pthread_create(), la structure allouée sur la pile peut être écrasé par d'autres données et pourrait causer des problèmes dans votre fonction de thread. Dans cet exemple, ce n'est pas un problème, puisque la création de thread attend que le thread de travail à terminer avant de retourner.
- Jaeger Oh! Merci à vous, c'est le problème que j'ai avec les autres, je travaillais avec. Je l'ai réparé par l'allocation sur le tas à l'aide de malloc(), comme Carson a dit. Que fait beaucoup plus de sens maintenant.
Vous devez vous connecter pour publier un commentaire.
Parce que vous dites
struct arg_struct *args = (struct arg_struct *)args;
au lieu de
struct arg_struct *args = arguments;
utilisation
en place de
main()
a son propre thread et variables de pile. allouer de la mémoire pour 'args' dans le tas ou de les rendre global:Puis, bien sûr, changer les références de
args->arg1
àargs.arg1
etc..Utilisation:
Et d'en faire des arguments comme ceci:
N'oubliez pas gratuit args! 😉
Les arguments de print_the_arguments est des arguments, de sorte que vous devez utiliser: