J'ai une question sur la programmation simultanée en C.
Dans la bibliothèque pthread, le prototype de pthread_join
est
int pthread_join(pthread_t tid, void **ret);
et le prototype de pthread_exit
est:
void pthread_exit(void *ret);
Donc, je suis confus que, pourquoi pthread_join
prend la valeur de retour du processus en tant que pointeur sur un pointeur void
à partir d'un fil de récolte, mais pthread_exit
ne prend qu'un pointeur void
à partir du fil sortant? Je veux dire fondamentalement, elles renvoient toutes les valeurs d'un thread. Pourquoi existe-t-il une différence de type?
Dans pthread_exit
, ret
est un paramètre d'entrée. Vous passez simplement l'adresse d'une variable à la fonction.
Dans pthread_join
, ret
est un paramètre de sortie. Vous récupérez une valeur de la fonction. Cette valeur peut, par exemple, être définie sur NULL
.
Longue explication:
Dans pthread_join
, vous récupérez l'adresse transmise à pthread_exit
par le fil fini. Si vous passez juste un pointeur simple, il est passé par valeur afin que vous ne puissiez pas changer où il pointe. Pour pouvoir changer la valeur du pointeur transmis à pthread_join, il doit être transmis en tant que pointeur lui-même, c'est-à-dire pointeur à pointeur.
Parce que chaque fois
void pthread_exit(void *ret);
sera appelé à partir de la fonction thread afin que vous souhaitiez simplement retourner son pointeur avec pthread_exit ().
Maintenant à
int pthread_join(pthread_t tid, void **ret);
sera toujours appelé à partir de l'endroit où le fil est créé, donc ici pour accepter le pointeur renvoyé dont vous avez besoin double pointeur ..
je pense que ce code vous aidera à comprendre cela
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
void* thread_function(void *ignoredInThisExample)
{
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'utilisation 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