web-dev-qa-db-fra.com

pthread_join () et pthread_exit ()

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?

41
Allan Jiang

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.

39
stefanB

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

}
31
Jeegar Patel

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
3