bonjour, je suis en train de lire un tutoriel sur les threads. J'aimerais savoir s'il-vous-plaît quel est le sens de « void * » dans cet exemple :
Merci d'avance.Code:void * maFonction(void * data)
Version imprimable
bonjour, je suis en train de lire un tutoriel sur les threads. J'aimerais savoir s'il-vous-plaît quel est le sens de « void * » dans cet exemple :
Merci d'avance.Code:void * maFonction(void * data)
C'est un pointeur vers n'importe quoi, la fonction devra se débrouiller pour savoir ce qui est dedans.
C'est utilisé pour transmettre un contexte.
Généralement, ce sera l'adresse d'une structure que l'auteur de la fonction aura défini.
void* permet d'écrire des fonctions utilisant des pointeurs de fonctions sans vraiment contraindre leur signature.
bonjour merci pour ta réponse
j'aimerais savoir si je met aussi mettre un autre argument dans la fonction ,je doit garder void* data?
Merci
Tu ne peux pas changer les arguments d'une procédure de thread, mais tu peux lui passer un pointeur vers ce que tu veux.
Généralement vers une structure allouée avec malloc().
slt merci pour ta réponse ,donc je déclare un pointeur dans le main et après je le passe au thread?
j'aimerais savoir si je peut utiliser les variables globales
merci.
Bonjour,
Oui tu peux utiliser des variables globales, mais il faut eviter.
Après tout dépend de ce que tu veux faire.
Si tu veux partager des variables entre plusieurs threads tu devras utiliser des semaphores, ou des mutex,.. pour protéger tes variables.
Je te déconseille les variables globales pour ce genre de choses. Un petit exemple pour les passages d'arguments à un thread :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 typedef struct thread_arg { int id; char *name; } thread_arg; void *thread_func(void *param) { thread_arg *a = param; printf("name : %s\nid : %d\n", a->name, a->id); return 0; //dans le cas présent ça n'a pas beaucoup d'importance } int main() { thread_arg *a; a = malloc(sizeof(*a)); a->name = strdup("yop"); a->id = 18; createthread((void*)a); threadjoin(); // pour permettre que tout s'affiche free(a); return EXIT_SUCCESS; }