问题:
pthread_exit和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))进入retval指向的位置。“
我编写的代码显示了这一点,请参阅代码注释:
#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 ***
答案 0 :(得分:5)
您的代码与手册页不矛盾。
如果retval不为NULL,则pthread_join()将目标线程的退出状态(即目标线程提供给pthread_exit(3)的值)复制到* retval指向的位置。
您使用pthread_join
来呼叫retval=&status
,因此它不是NULL。
您调用了pthread_exit(0xbfa64878)
,因此目标主题的退出状态为0xbfa64878
,并且会被复制到*retval
即status = 0xbfa64878
,这就是您打印出来的内容。
我认为你把事情与诸如“返回状态的地址”和“arg地址”之类的标签混淆了......你给pthreads并不暗示的值赋予了标签。手册页所说的是*retval
设置为传递给pthread_exit
的值,这就是您的测试显示的内容。
在您提议的更改中:
如果retval不为NULL,则pthread_join()将保存目标线程退出状态的变量的地址(即目标线程提供给pthread_exit(3)的值)复制到retval指向的位置
什么是“保存目标线程退出状态的变量”? Pthreads没有定义这样的东西。目标线程的退出状态是传递给pthread_exit
的值,它不是某个其他变量的值。