Linux多线程04-连接已终止的线程
pthread_join
描述:
pthread_join() 函数等待由 thread 指定的线程终止。如果该线程已经终止,则pthread_join()将立即返回。由thread指定的线程必须是可连接的。
如果retval不为NULL,则pthread_join()将目标线程的退出状态(即目标线程提供给pthread_exit(3)的值)复制到retval指向的位置。如果目标线程被取消,则PTHREAD_CANCELED将放置在retval中。
如果多个线程同时尝试加入同一个线程,则结果是未定义的。如果调用pthread_join()的线程被取消,则目标线程将保持可连接状态(即它将不会被分离)。
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
功能: 和一个已经终止的线程进行连接, 进行资源回收
子线程不一定需要通过主线程来回收, 任何一个线程都可以回收其他已经终止的线程
这个函数是阻塞函数, 调用一次只能回收一个子线程
(一般在主线程中去使用)
参数:
- thread: 需要回收的子线程ID
- retval: 二级指针, 接收子线程退出时的返回值(pthread_exit(void *retval)中的retval)
返回:
- 成功 0
- 失败 非0错误号
Compile and link with -pthread.
代码实例
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
int value = 10;
void* callback(void* arg)
{
printf("child thread id: %ld\n",pthread_self());
sleep(3);
// return NULL;
pthread_exit((void*)&value);
}
int main(){
pthread_t tid;
int ret = pthread_create(&tid, NULL, callback, NULL);
if(ret != 0)
{
char* errstr = strerror(ret);
printf("error: %s\n", errstr);
}
//主线程
int i = 0;
for(;i<5;i++){
printf("%d\n",i);
}
printf("tid: %ld, main thread id: %ld\n", tid, pthread_self());
//主线程调用pthread_join回收子线程资源
int* thread_retval;
ret = pthread_join(tid, (void**)&thread_retval);
if(ret != 0)
{
char* errstr = strerror(ret);
printf("error: %s\n", errstr);
}
printf("exit data: %d\n", *thread_retval);//10
printf("回收子线程资源成功!\n"); //阻塞了3S
pthread_exit(NULL);
return 0;
}
运行结果
0
1
2
3
4
tid: 139739205437184, main thread id: 139739213825856
child thread id: 139739205437184
exit data: 10
回收子线程资源成功!