web-dev-qa-db-ja.com

pthread_join()およびpthread_exit()

C並行プログラミングについて質問があります。

Pthreadライブラリでは、pthread_joinのプロトタイプは

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

pthread_exitのプロトタイプは次のとおりです。

void pthread_exit(void *ret);

だから、なぜpthread_joinはプロセスの戻り値を刈り取られたスレッドからのvoidポインターへのポインターとして受け取るのか、しかしpthread_exitvoidポインターのみを受け取る終了したスレッド?基本的に、それらはすべてスレッドからの戻り値であり、なぜ型に違いがあるのですか?

41
Allan Jiang

pthread_exitでは、retは入力パラメーターです。変数のアドレスを関数に渡すだけです。

pthread_joinでは、retは出力パラメーターです。関数から値を取得します。このような値は、たとえばNULLに設定できます。

長い説明:

pthread_joinでは、完成したスレッドによってpthread_exitに渡されたアドレスを取得します。単純なポインターだけを渡す場合、値によって渡されるため、ポインターが指す場所を変更することはできません。 pthread_joinに渡されるポインターの値を変更できるようにするには、ポインター自体、つまりポインターへのポインターとして渡す必要があります。

39
stefanB

それは毎回

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

}
31
Jeegar Patel

典型的な用途は

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