pthread_join () и pthread_exit () - PullRequest
       26

pthread_join () и pthread_exit ()

41 голосов
/ 15 декабря 2011

У меня есть вопрос о параллельном программировании на Си.

В библиотеке pthread прототип pthread_join равен

int pthread_join(pthread_t tid, void **ret);

, а прототип pthread_exit:

void pthread_exit(void *ret);

Поэтому меня смущает, почему pthread_join принимает возвращаемое значение процесса в качестве указателя на указатель void из собранного потока, а pthread_exit принимает только указатель void извыход из темы?Я имею в виду, что в основном все они возвращают значения из потока, почему существует разница в типе?

Ответы [ 3 ]

40 голосов
/ 15 декабря 2011

In pthread_exit, ret - входной параметр.Вы просто передаете адрес переменной в функцию.

In pthread_join, ret - выходной параметр.Вы получаете значение из функции.Такое значение, например, может быть установлено на NULL.

Длинное объяснение:

В pthread_join вы возвращаете адрес, переданный в pthread_exit готовым потоком.Если вы передаете только простой указатель, он передается по значению, поэтому вы не можете изменить, куда он указывает.Чтобы иметь возможность изменить значение указателя, переданного в pthread_join, оно должно быть передано как сам указатель, то есть указатель на указатель.

31 голосов
/ 15 декабря 2011

Это потому что каждый раз

void pthread_exit(void *ret);

будет вызываться из потоковой функции, так что когда вы захотите просто вернуть ее указатель с помощью pthread_exit ().

Сейчас на

int pthread_join(pthread_t tid, void **ret);

всегда будет вызываться из того места, где создан поток, поэтому здесь, чтобы принять возвращенный указатель, вам нужно двойной указатель ..

я думаю, что этот код поможет вам понять это

#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

}
3 голосов
/ 15 декабря 2011

Типичное использование

void* ret = NULL;
pthread_t tid = something; /// change it suitably
if (pthread_join (tid, &ret)) 
   handle_error();
// do something with the return value ret
...