函数:
int pthread_detach(pthread_t thread); // 参数:线程 ID
最大特点:
(1)子进程会自己回收 PCB,因此调用该函数之后,不需要调用 pthread_join。
(2)设置了线程分离,该线程就是不可回收的,使用 pthread_join 反而会报错。
举例:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void *thr(void *arg) {
int xx = 107;
printf("I am a thread,tid=%lu\n",pthread_self());
sleep(3); // 验证阻塞
pthread_exit((void*)xx);
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,thr,NULL);
pthread_detach(tid); //设置线程分离
void *retval = NULL;
int ret= pthread_join(tid, &retval); //回收子进程资源
if(ret > 0){
printf("join err , ret=%d, errmsg=%s\n", ret, strerror(ret)); // 回收会报错,因此会执行这句话
}
return 0;
}
除了使用 pthread_detach 函数设置线程分离外,也可以在 pthread_create 创建线程时候直接指定分离属性。
创建线程函数:
int pthread_create(
pthread_t *thread, //线程 ID = 无符号长整形 %lu //传出参数,以返回值告知创建的线程 ID
const pthread_attr_t *attr, // 线程属性
void *(*start_routine) (void *), // 线程都有明确的任务 // 回调函数形式 void* func(void* arg)
void *arg // 线程处理函数的参数 // 给回调函数传参
);
通过线程属性参数设置属性分离步骤:
(1)定义属性变量 pthread_attr_t attr;
(2)初始化属性变量 pthread_attr_init(&attr);
(3)设置属性变量
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
参数 1:属性变量的地址
参数 2:
PTHREAD_CREATE_DETACHED :分离
PTHREAD_CREATE_JOINABLE :非分离
使用 :
pthread_attr_setdetachstate( &attr , PTHREAD_CREATE_DETACHED );
(4)创建线程
pthread_create(&tid , &attr , func , NULL);
(5)释放线程资源
int pthread_attr_destroy(pthread_attr_t *attr);
版权声明:本文为weixin_42374938原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。