2

问题:

pthread_exit 和 pthread_join 之间的退出状态究竟是如何传递的?

pthread_join 手册页

   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:

我在线程中。

arg地址为0xbfa64878 0xbfa64878

返回状态地址为0xbfa64878,返回状态为991***

4

1 回答 1

5

您的代码与手册页不矛盾。

如果 retval 不为 NULL,则 pthread_join() 将目标线程的退出状态(即目标线程提供给 pthread_exit(3) 的值)复制到 *retval 指向的位置。

pthread_join用打电话retval=&status,所以它不是 NULL。

您调用pthread_exit(0xbfa64878)了目标线程的退出状态,0xbfa64878并将其复制到*retvaliestatus = 0xbfa64878中,这就是您打印出来的内容。

我认为您将诸如“返回状态的地址”和“arg 地址”之类的标签混淆了……您正在为 pthreads 不暗示的值提供标签。手册页所说的是*retval设置为传递给的值pthread_exit,这就是您的测试显示的内容。

在您提议的更改中:

如果 retval 不为 NULL,则 pthread_join() 将保存目标线程退出状态的变量的地址(即目标线程提供给 pthread_exit(3) 的值)复制到 retval 指向的位置。

什么是“保持目标线程退出状态的变量”?Pthreads 没有定义这样的东西。目标线程的退出状态是传递给的pthread_exit值,而不是其他变量的值。

于 2013-05-18T22:56:14.310 回答