pthread join () et pthread exit()
j'ai une question au sujet de la programmation de la concurrence.
Dans la bibliothèque pthread, le prototype de pthread_join
int pthread_join(pthread_t tid, void **ret);
et le prototype de pthread_exit
est:
void pthread_exit(void *ret);
Donc, je suis confus, pourquoi pthread_join
prend la valeur de retour du processus comme un pointeur vers un void
pointeur du fil reaped, mais pthread_exit
prend seulement un void
pointeur du fil sorti? Je veux dire fondamentalement ils sont tous des valeurs de retour d'un fil, pourquoi il y a un différence entre le type?
3 réponses
pthread_exit
,ret
est un paramètre d'entrée. Vous passez simplement l'adresse d'une variable à la fonction.
pthread_join
, ret
est un paramètre de sortie. Vous récupérez une valeur de la fonction. Une telle valeur peut, par exemple, être fixé à NULL
.
Longue explication:
pthread_join
, vous récupérez l'adresse passée à pthread_exit
par le fil fini. Si vous passez juste un pointeur simple, il est passé par la valeur de sorte que vous ne pouvez pas changer où il est pointant vers des. Pour être en mesure de modifier la valeur du pointeur est passé à pthread_join, il doit être passé comme un pointeur lui-même, qui est un pointeur vers un pointeur.
parce que à chaque fois
void pthread_exit(void *ret);
sera appelé à partir de la fonction thread de sorte que chaque fois que vous voulez retourner simplement son passe de pointeur avec pthread_exit().
int pthread_join(pthread_t tid, void **ret);
sera toujours appelé d'où le thread est créé donc ici pour accepter que le pointeur retourné dont vous avez besoin double pointeur ..
je pense que ce code va vous aider à comprendre ce
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
void* thread_function(void)
{
char *a = malloc(10);
strcpy(a,"hello world");
pthread_exit((void*)a);
}
int main()
{
pthread_t thread_id;
char *b;
pthread_create (&thread_id, NULL,&thread_function, NULL);
pthread_join(thread_id,(void**)&b); //here we are reciving one pointer
value so to use that we need double pointer
printf("b is %s",b);
free(b); // lets free the memory
}
l'usage typique est
void* ret = NULL;
pthread_t tid = something; /// change it suitably
if (pthread_join (tid, &ret))
handle_error();
// do something with the return value ret