Подтвердить что ты не робот

Pthread_join() и pthread_exit()

У меня вопрос о программировании C concurrency.

В библиотеке pthread прототипом pthread_join является

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

и прототипом pthread_exit является:

void pthread_exit(void *ret);

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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)
{
    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

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

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