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
из выходящего потока? Я имею в виду, что они все возвращают значения из потока, почему существует разница в типе?
Ответы
Ответ 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