Passer plusieurs arguments à un thread en C (pthread_create)
Je suis en train de passer 2 les entiers non signés sur un nouveau thread en C (à l'aide de pthread_create ()), mais ni l'un tableau de 2 entiers ou d'un struct semble fonctionner.
//In my socket file
struct dimension {
unsigned int width;
unsigned int height;
};
unsigned int width, height;
void setUpSocket(void* dimension) {
struct dimension* dim = (struct dimension*) dimension;
width = dim->width;
height = dim->height;
printf("\n\nWidth: %d, Height: %d\n\n", width, height);
}
//In main.cpp
//Pass a struct in pthread_create
struct dimension dim;
dim.width = w;
dim.height = h;
pthread_create(&ph, &attr, (void * (*)(void *)) setUpSocket, (void *) &dim);
Avant d'appeler pthread_create, dim.largeur et dim.hauteur sont corrects. Dans mon fichier de socket, seule la largeur est définie, la hauteur est de 0, et je ne comprends pas pourquoi.
Personne ne sait quel est le problème s'il vous plaît et comment le résoudre?
Merci beaucoup.
- votre fil doit retourner
void *
et pasvoid
. Ainsi, vous pouvez arrêter de le faire funky typecasting je ne comprends pas 😛
Vous devez vous connecter pour publier un commentaire.
La façon dont vous êtes en passant les arguments devrait fonctionner correctement, tant que
dim
n'est pas alloué sur la pile. Si c'est sur la pile, alors qu'il pourrait devenir libéré avant le nouveau thread a une chance à courir, entraînant un comportement indéfini. Si vous êtes seulement à la création d'un thread, vous pouvez utiliser une variable globale, mais la meilleure solution est d'allouer sur le tas.Aussi, vous devriez pas remettre le pointeur de fonction: c'est un comportement indéfini (et, en fait, il peut se bloquer en raison de la spéculation sur l'exécution de l'architecture IA64). Vous devez déclarer votre fil de la procédure de retour
void*
et d'éviter un pointeur de fonction cast:Grand comment la largeur et la hauteur de l'être? Si pas très grande, je voudrais faire quelque chose comme ceci:
Vous passez un pointeur vers une variable de portée locale. Si l'appelant de la fonction se termine avant que le thread a ramassé les valeurs, alors que la variable d'aller hors de la portée et son contenu ne sera pas défini.
Vous de la création de la structure d'argument sur la pile, qui est le stockage temporaire et est ré-utilisé par l'appel de la fonction de la chaîne. C'est probablement remplacé par le temps de la discussion commence. Vous avez besoin de passer un pointeur vers statique ou de segment de mémoire allouée.