C並行プログラミングについて質問があります。
Pthreadライブラリでは、pthread_join
のプロトタイプは
int pthread_join(pthread_t tid, void **ret);
pthread_exit
のプロトタイプは次のとおりです。
void pthread_exit(void *ret);
だから、なぜpthread_join
はプロセスの戻り値を刈り取られたスレッドからのvoid
ポインターへのポインターとして受け取るのか、しかしpthread_exit
はvoid
ポインターのみを受け取る終了したスレッド?基本的に、それらはすべてスレッドからの戻り値であり、なぜ型に違いがあるのですか?
pthread_exit
では、ret
は入力パラメーターです。変数のアドレスを関数に渡すだけです。
pthread_join
では、ret
は出力パラメーターです。関数から値を取得します。このような値は、たとえばNULL
に設定できます。
長い説明:
pthread_join
では、完成したスレッドによってpthread_exit
に渡されたアドレスを取得します。単純なポインターだけを渡す場合、値によって渡されるため、ポインターが指す場所を変更することはできません。 pthread_joinに渡されるポインターの値を変更できるようにするには、ポインター自体、つまりポインターへのポインターとして渡す必要があります。
それは毎回
void pthread_exit(void *ret);
スレッド関数から呼び出されるため、単にpthread_exit()でポインターパスを返したいだけです。
今で
int pthread_join(pthread_t tid, void **ret);
スレッドが作成された場所から常に呼び出されるため、ここで必要な返されたポインタを受け入れるためにdouble pointer ..
このコードはこれを理解するのに役立つと思います
#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
}
典型的な用途は
void* ret = NULL;
pthread_t tid = something; /// change it suitably
if (pthread_join (tid, &ret))
handle_error();
// do something with the return value ret