pthread_join returns a NULL address
我是 C 线程编程的新手。我在下面尝试了一个简单的程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ret 状态打印为 NULL 。为什么它打印一个 NULL 地址。
The ret status prints as NULL . Why does it print a NULL address.
这是因为你的线程函数返回
1 | return NULL; |
如果你把它改成类似
1 | return"Hello, multithreaded world!"; |
你会看到字符串被主线程打印出来了。
因为你的函数返回
换句话说,无论你的函数返回什么,它都会返回。
检查这个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<stdio.h> #include<pthread.h> void* func(void* arg){ sleep(1); printf("\ tid : %u \ ",(unsigned int)pthread_self()); return"I am done"; // I changed the return line } int main(){ pthread_t tid; void* ret; pthread_create(&tid,NULL,&func,NULL); pthread_join(tid,&ret); printf("\ ret status : %s \ ",(char *)ret); return 0; } |
输出:
1 2 3 4 5 | samaras@samaras-A15:~$ ./px tid : 3075947328 ret status : I am done <-- and not NULL |
您应该阅读手册。
The pthread_join() function shall suspend execution of the calling thread until the target thread terminates, unless the target thread has already terminated. On return from a successful pthread_join() call with a non-NULL value_ptr argument, the value passed to pthread_exit() by the terminating thread shall be made available in the location referenced by value_ptr. When a pthread_join() returns successfully, the target thread has been terminated.
我还建议你阅读这个问题并检查这个链接,它实际上展示了你如何使用这个功能。
PS - 我给你一个 1 以表示平衡,但下次请在询问之前更加努力地搜索。 :)
首先,你需要调用
1 2 3 4 5 6 7 | void* func(void* arg){ sleep(1); printf("\ tid : %u \ ",(unsigned int)pthread_self()); pthread_exit(NULL); } |
另外,如果你返回