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?

39
demandé sur Kevin 2011-12-15 05:08:57

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.

36
répondu stefanB 2013-04-17 16:39:29

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

}
27
répondu Jeegar Patel 2015-12-14 09:22:29

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
3
répondu Basile Starynkevitch 2011-12-15 01:13:25