问题:
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) 的值)复制到指向的位置回复。”
我写了这段代码来显示这一点,请参阅代码注释:
#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***