Le passage de structures comme arguments lors de l'utilisation pthread_create()
J'ai essayé de passer une structure comme le 4ème argument lors de l'utilisation pthread_create()
avec quelque chose comme ceci:
pthread_create(&tid1, NULL, calca, &t); //t is the struct
Maintenant, chaque fois que j'essaie d'accéder à des variables dans la structure - t.une, t.b ou t.c, je reçois un message d'erreur - demande de membre dans quelque chose de pas une structure ou d'une union.
Quelle autre méthode pourrais-je utiliser pour transmettre des structures dans le fil?
Vous devez vous connecter pour publier un commentaire.
Vous êtes probablement à la création de la structure dans le même champ d'application que pthread_create. Cette structure ne sera plus valide une fois que le champ d'application est quittée.
Essayez de créer un pointeur vers la structure sur le tas et de pointeur de structure de votre fil. N'oubliez pas de supprimer de la mémoire quelque part (dans le thread si vous ne serez jamais l'utiliser à nouveau - ou lorsque vous n'en avez plus besoin).
Aussi, comme cyberconte mentionné, si vous allez accéder à ces données à partir de différents threads, vous aurez besoin de verrouiller l'accès à un mutex ou de la section critique.
Modifier le 14 Mai, 2009 @ 12:19 PM HNE: Aussi, comme d'autres personnes l'ont mentionné, vous devez lancer votre paramètre pour le type correct.
Si vous êtes de passage à une variable qui est une structure globale (dont vous semblez être en insistant sur l'), votre fonction de thread aura cast vers le type:
Ou, si vous êtes de passage à un pointeur de votre structure:
Si vous êtes à l'intérieur de votre fonction de thread, l'argument que vous transmettre est un void*. Vous aurez besoin de la convertir en une structure avant de pouvoir l'utiliser en tant que tel.
Créer un sémaphore
Créer une autre structure qui se compose d'un pointeur de votre structure et le sémaphore de la poignée
Passer un pointeur vers cette nouvelle structure à pthread_create
Dans le parent de fil, c'est à dire qui a appelé pthread_create, l'attente sur le sémaphore
De l'enfant thread, copier les membres de votre structure pour les variables locales ou les enregistrer ailleurs
Dans l'enfant du fil, le signal sémaphore
Dans le parent de fil, à proximité du sémaphore
Vous pouvez utiliser la mémoire partagée ou une variable globale, (si rien d'autre n'a besoin que de l'argumentation) ou une linkedlist si ce sont des fils qui se nourrissent de données.
N'oubliez pas de verrouiller vos variables qui sont thread-partagée.
Sans code malveillant, cependant, je ne peux pas vous dire ce que vous faites mal dans votre application actuelle.
Ce message d'erreur signifie que vous n'êtes pas un déréférencement du pointeur.
Vous êtes en train de dire "t.un" au lieu de "t->un"
J'avais souvent l'habitude de faire les mêmes erreurs figurant dans les autres réponses, mais maintenant, je prends une approche légèrement différente qui se déplace le potentiel de l'erreur de la threading fonction pthread_create appel.
Je déclarer et définir le filetage de la fonction à un niveau "normal": les
et quand je l'appelle pthread_create, j'ai besoin d'utiliser un cast:
Je n'ai presque jamais oublier d'utiliser le & sur les Paramètres, et le compilateur va prendre soin de toutes les erreurs que j'ai faites sur l'autre extrémité. Fonctionne très bien pour les rappels, trop.
my_struct foo = (my_struct)(*arg); est incoreect
essayez
my_struct *foo = (my_struct *)(arg);
ET, int la fonction qui appelle le fil,
assurez-vous que le statique (donc la mémoire d'être souligné, n'est pas perdu dans le brouillard)