pthread_t pointeur en argument de pthread_create
Le premier argument de pthread_create est un pthread_t pointeur. Dans le programme bonjour ci-dessous, si le premier argument est un pointeur vers pthread_t (pthread_t*
) au lieu d'un pthread_t (pthread_t
) le programme se termine avec Segmentation fault
...pourquoi?
Je ne me souviens pas de voir pthread_t*
que le type déclaré de la premier argument de pthread_create
.
Et le chapitre 2 de Butenhof du livre de la Programmation avec les Threads POSIX dit:
Pour créer un thread, vous devez déclarer une variable de type
pthread_t
[paspthread_t*
].
Mais selon la spécification le premier argument de pthread_create
est un pointeur vers pthread_t
, alors pourquoi l'erreur de segmentation?
Faute de Segmentation
pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);
Fonctionne OK
pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);
bonjour programme:
#include <pthread.h>
#include <stdio.h>
void *
hello(void *arg){
printf("Hello\n");
pthread_exit(NULL);
}
int
main(int argc, char **argv){
pthread_t thr = 1;
pthread_create(&thr, NULL, &hello, NULL);
pthread_join(thr, NULL);
return 0;
}
pthread_create prototype:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
OriginalL'auteur user454322 | 2012-12-19
Vous devez vous connecter pour publier un commentaire.
déclare un pointeur vers une
pthread_t
sans allocation de stockage pour elle. Lorsque vous appelezpthread_create
, il va essayer d'écrire à*thr
. C'est à un emplacement non défini et sera presque certainement un échec.fonctionne parce que vous avez déclarer de stockage (
thr
sur la pile) pour unpthread_t
.Noter que le second, le travail, la version simplifiée de ce qui est utilisé dans votre programme bonjour
...qui déclare un
pthread_t
sur la pile, puis passe un pointeur danspthread_create
.&
alloue de l'espace! Je ne pouvais donc pas une telle chose stupide. MerciNotez que le second, le travail, la version peut être simplifiée dans le programme bonjour.
Oh, oui, je crains que je n'avais pas lu que loin sur la question. Je vais mettre à jour ma réponse
OriginalL'auteur simonc
C'est parce que si vous il suffit de déclarer un pointeur, vous ne pouvez pas vous attendre à point alloué, initialisation de la mémoire.
Lorsque vous déclarez une
pthread_t
il est attribué de son propre petit bloc de mémoire que vous pouvez ensuite obtenir l'adresse de la&
de l'opérateur et de le passer àpthread_create
.&
le pointeur n'est pas initialisé. Je vous remercie.Le
&
opérateur prend l'adresse de lapthread_t
comme un pointeur de typepthread_t *
et cela peut ensuite être utilisé pour appelerpthread_create
. Il n'a pas d'initialiser le pointeur d'autant qu'il suffit de créer un pointeur valide pour une zone de mémoire allouée.Peut-être que je n'étais pas clair. Avec l'initialisation du pointeur, je voulais prendre l'adresse de (point, par exemple, l'affectation de l'adresse de
thr
àpntr
) la mémoire où la pthread_t se réfère. Remarque: juste entrepthread_t* pntr = &thr;
et l'appel àpthread_create
pntr
vers la mémoire non (parce que thr n'a pas été initialisé).pntr
pointe vers alloués de mémoire, car il points de&thr
;thr
pourrait très bien être non initialisée, cependant.Je vois votre point de vue. Puis
pntr
points de&thr
qui à son tour les points de la mémoire non... droite?OriginalL'auteur
Si vous voulez créer un peu de fil, vous pouvez utiliser le code ci-dessous:
De cette façon, vous devez allouer de la mémoire pour vos poignées avant d'appeler
pthread_create
, tout comme lorsque vous voulez créer certains "struct" vous devez d'abord allouer de la mémoire pour eux.OriginalL'auteur Mehdi