Comment passer des paramètres à un thread en c multithreading correctement
Je suis en train d'apprendre le C multithreading, et j'ai vu un couple de choses rares.
Je comprends que le passage de paramètres à un thread doit être fait avec des pointeurs. J'ai trouvé un exemple qui, je ne comprends pas. Je vais copier les lignes:
pthread_t tid[MAX_THREADS]
int n_veg
pthread_create(&tid[n],NULL,caracter,(void *)n_veg)
caractère est évidemment un predeclared fonction.
Maintenant, pourquoi avons-nous utiliser un pointeur void casting au lieu d'un int pointeur de casting? Est-il pertinent différence?
Deuxièmement, pourquoi utiliser un pointeur de casting en premier lieu? Ne pouvons-nous pas utiliser "&n_veg" comme avec le premier paramètre?
Merci d'avance.
OriginalL'auteur bluehallu | 2010-11-19
Vous devez vous connecter pour publier un commentaire.
Depuis vos deux questions sont liées, je vais y répondre ensemble:
pthread_create
prend unvoid *
paramètre, de sorte que vous pouvez vraiment passer un pointeur que vous voulez. Dans ce cas cependant, nous ne sommes pas réellement en passant un pointeur, mais juste une simple valeur d'entier se répartit comme un pointeur. Cela signifie que vous aurez accès comme cecicaracter
:Comme vous l'avez mentionné, vous pourriez très bien passer un réel pointeur comme
&n_veg
et récupérer la valeur comme ceci:En fait, dans la plupart des cas, vous aurez besoin de passer plus de données que seulement un nombre entier, comme une structure, et dans ce cas, vous doit passer un pointeur, comme vous ne pouvez pas simplement jeter un pointeur comme un entier.
Une chose à garder à l'esprit lorsque vous passez un pointeur, c'est que
n_veg
ne doit pas aller hors de portée tant que le thread est en cours d'exécution. Par exemple, si vous n':puis
&n_veg
sera invalide dès quetest
retourne, mais le thread peut être encore en cours d'exécution et sera tenue d'une adresse non valide. De ce fait, les structures passé pour les threads sont normalement allouée dynamiquement, en utilisantmalloc
, et le fil peutfree
une fois qu'il a terminé.Oui, il est. Si vous passez dans un vrai pointeur, vous pouvez modifier la valeur d'origine à l'aide du pointeur. Sur
*(int *)n_veg
: pour utiliser unvoid *
, vous avez besoin de jeter un type réel, d'où le(int *)
, puis le*
déréférence le pointeur pour obtenir de la valeur.Tout est clair. Merci beaucoup!
OriginalL'auteur casablanca
pthread_create
est définie comme suit:Donc il s'attend à un
void *
comme son dernier paramètre. Si vous omettez le casting, le compilateur ne vous donner un avertissement.OriginalL'auteur Ole Begemann