問題:pthread_exit和pthread_join之間的退出狀態是如何傳遞的?手冊頁需要更正嗎?
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 ***
...和你的問題是什麼? – stakx
退出狀態*是*空指針。它不是*(必然)是任何東西的地址。 –
@stakx我添加了一個問題。我認爲我的問題是隱含的,但現在我添加了一個明確的問題。感謝您指出了這一點。 – abc