2

質問:

pthread_exit と pthread_join の間で終了ステータスがどの程度正確に渡されますか?

pthread_joinのmanページから

   int pthread_join(pthread_t thread, void **retval);

retval が NULL でない場合、pthread_join() は、ターゲット スレッドの終了ステータス (つまり、ターゲット スレッドが pthread_exit(3) に提供した値) を *retval が指す場所にコピーします。ターゲット スレッドがキャンセルされた場合、PTHREAD_CANCELED が *retval に配置されます。

マニュアルページの文言が間違っていると思います。

「retval が NULL でない場合、pthread_join() は、ターゲット スレッドの終了ステータスを保持する変数のアドレス (つまり、ターゲット スレッドが pthread_exit(3) に提供した値) を、戻ります。」

これを示すこのコードを書きました。コードのコメントを参照してください。

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

void * function(void*);

int main()
{
    pthread_t thread;
    int arg = 991;
    int * status; // notice I did not intialize status, status is *retval
    pthread_create(&thread, NULL, function, (void*)(&arg));

    pthread_join(thread, (void **)(&status));//passing address of status,&status is retval 

    //(2) this address is same as printed in (1)
    printf("The address of returned status is %p,", status); 

    printf("The returned status is %d\n", *status);
}

void * function(void * arg)
{
    int *p;
    p = (int*)arg;
    printf("I am in thread.\n");

     //(1) printing the address of variable holding the exit status of thread, see (2)                                                              
    printf("The arg address is %p %p\n", p, arg); 

    pthread_exit(arg);
}

サンプル o/p:

私はスレッドにいます。

引数アドレスは 0xbfa64878 0xbfa64878 です

返されるステータスのアドレスは 0xbfa64878、返されるステータスは 991***

4

1 に答える 1

5

あなたのコードはマニュアルページと矛盾していません。

retval が NULL でない場合、pthread_join() は、ターゲット スレッドの終了ステータス (つまり、ターゲット スレッドが pthread_exit(3) に提供した値) を *retval が指す場所にコピーします。

pthread_joinで呼び出すretval=&statusので、NULL ではありません。

あなたが呼び出しpthread_exit(0xbfa64878)たので、ターゲットスレッドの終了ステータスは であり、それがieに0xbfa64878コピーされます。これが出力されます。*retvalstatus = 0xbfa64878

「返されたステータスのアドレス」や「引数アドレス」などのラベルと混同していると思います... pthreadsが意味しない値にラベルを付けています。マニュアルページに記載されているのは*retval、渡された値に設定され、それがpthread_exitテストで示されることです。

提案された変更では:

retval が NULL でない場合、pthread_join() は、ターゲットスレッドの終了ステータス (つまり、ターゲットスレッドが pthread_exit(3) に提供した値) を保持する変数のアドレスを、retval が指す場所にコピーします。

「対象スレッドの終了ステータスを保持する変数」とは?Pthreads では、そのようなことは定義されていません。ターゲット スレッドの終了ステータスは に渡されるpthread_exit値であり、他の変数の値ではありません。

于 2013-05-18T22:56:14.310 に答える