J'ai écrit une tâche simple comme ci-dessous. Il imprime une chaîne, incrémente la variable globale globale et renvoie sa valeur, via Pthread_exit, à la pthread_join. Le compilateur me donne l'erreur: p> main.c: In function âmainâ:
main.c:29:2: warning: âppvglobâ may be used uninitialized in this function [-Wmaybe-uninitialized]
29 | pthread_join(tid, ppvglob);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
3 Réponses :
Lorsque vous faites:
% gcc -Wall c.c -lpthread % ./a.out I am a simple thread. Variabile globale restituita alla terminazione del thread: 1
Bonjour @bruno, pourriez-vous m'expliquer comment venir et pvglob est initialisé s'il vous plaît? Je ne l'ai jamais utilisé auparavant et le pthread_exit retourne un vide *, à la place & pvglob est un vide **. Peut-être que le pthread_exit à l'intérieur fait une conversion de Void * en vide ** et le transmettre à la pthread_join?
@Gennaroarguzzi pvglob i> est défini avec l'état de sortie du filetage cible (c.-à-d. La valeur que le fil cible fournie à pthread_exit), si le thread cible a été annulé, puis par pthread_canceled (voir
@Gennaroarguzzi Il n'y a pas de conversion de Void ** code> à
Void * code>, le deuxième argument de
pthread_join code> est un pointeur pour permettre à la fonction de définir la fonction Valeur, dans ce cas, le pointeur pointe vers un
vide * code> car il s'agit du type de retour de la fonction Toplevel du fil / défini par
pthread_exit code>. Supposant que la fonction de toplevel d'un thread renvoie un
int code> puis
pthread_exit code> obtenez un
int code> Pour être cohérent, puis
pthread_join code> a Pour obtenir un
int * code>
Je n'ai qu'un doute: pourquoi le compilateur dit-il que le «PPVGLOB» peut être utilisé ininitialisé? Il est ininitialisé parce que je ne l'ai jamais utilisé auparavant.
@Gennaroarguzzi Il est ininitialisé parce que vous utilisez sa valeur avant de la définir. void ** ppvglob; code> définit ppvglob i> sans l'initialisation. Si c'est une variable globale, elle est initialisée par NULL par défaut, mais dans votre cas, il s'agit d'une variable locale, donc aucune initialisation par défaut
@Gennaroarguzzi mais donnant son adresse ( & pvglob code>) sa valeur n'est pas utilisée à ce niveau et le fait qu'il n'est pas initialisé n'est pas pertinent => aucun avertissement
Dans tous les cas, vous ne déclarez pas simplement un type pthread_join () code> a un paramètre
void ** code> car il doit mettre à jour em> un
EXISTANT
VOID * CODE>.
C'est la même logique que fournir et int * code> à
scanf ("% d", ...) code>: pour mettre à jour un
int code> vous besoin de fournir son adresse.
Dans le cas général, lorsqu'une fonction C doit mettre à jour un type existant code>,
Ensuite, il a besoin d'un paramètre
type * code>. p>
non initialisé * code> mais
Fournissez l'adresse (
& code>) d'un type
existant code>.
Donc, ici, vous devez prendre l'adresse d'un vide * code> de sorte que
Le paramètre est initialisé à un emplacement où un
void * code> se tient réellement. p>
L'idée ici est d'avoir un ... et de transmettre son adresse em> à pthread_join () code> La fonction peut donc indiquer la valeur "retour" ... p> ceci "rendant le point" valeur "nécessite ... donc que Votre em> Que vous em> a déclaré ... P> vide * code> ...
pthread_join () code> à Dérenceference em> son paramètre ... p>
glob code> aura changé sa valeur. P>
void * glob;
/* ... */
pthread_join(tid, &glob);
int * v = (int*)glob;
printf("Variabile globale restituita alla terminazione del thread: %d\n", *v);
Votre rappel de Pthread doit avoir le format
Void * F (vide *) code> et rien d'autre. Les fonctions qui renvoient une valeur doivent en réalité
retourner code> aussi.