5.pthread_detach函数
作用:实现线程分离,好处:自动清理PCB
原型: int pthread_detach(pthread_t thread); 成功:0;失败:错误号
注意:一般情况下,线程终止后,其终止状态一直保留到其它线程调用 pthread_join 获取它的状态为止。但是线程也
可以被置为 detach 状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经
处于 detach 状态的线程调用 pthread_join,这样的调用将返回 EINVAL 错误。也就是说,如果已经对一个线程调用了
pthread_detach 就不能再调用 pthread_join 了。
代码:pthrd_detach.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
void *tfn(void *arg)
{
int n = 3;
while(n--){
printf("thread count %d\n", n);
}
//return (void*)1;
pthread_exit((void*)1);
}
int main()
{
pthread_t tid;
void *tret;
int err;
//创建一个子线程
pthread_create(&tid, NULL, tfn, NULL);
pthread_detach(tid); //让线程分离----自动退出,无系统残留资源
while(1){
//回收子线程(阻塞等待回收),pthread_join函数返回值:成功返回0,失败返回错误号
err = pthread_join(tid, (void**)&tret);
printf("----------err = %d\n", err);//----------err = 22
if(err != 0)
//因为创建线程之后,又让线程分离,所以pthread_join函数的参数tid不是pthread_create的传出参数tid,即无效的参数
fprintf(stderr,"thread_join error: %s\n", strerror(err));//thread_join error: Invalid argument
else
fprintf(stderr,"thread exit code: %d\n", (int)tret);
sleep(1);
}
return 0;
}
结果: