1、描述
linux的POSIX线程分离状态决定一个线程以什么方式来终止。默认的分离状态是可连接态(joinable),创建线程是参数设置为NULL,就是默认连接态,可以被pthread_join。
Linux的POSIX线程要么分离要么连接分别用一下宏表示:
- 分离状态:PTHREAD_CREAT_DETACHED
- 连接态:PTHREAD_CREAT_JOINABLE
一个可连接的线程的特点:
- 可以被其他线程回收资源和杀死或取消
- 不会主动释放线程占用的线程资源,堆栈和描述符等,即使线程自己返回或结束或调用pthread_exit都不会释放
- 必须调用pthread_join且返回后释放资源,避免僵尸线程。
- 如果不用pthread_join,父线程先于子线程退出,则子线程会被init线程接管,由init进程调用wait系列函数进行回收资源。
注意:为避免内存泄露,可连接的线程终止时要么设为可分离要么使用pthread_join释放资源。一个线程不能被多个线程等待,
一个可分离的线程的特点:
- 自己退出或者调用pthread_exit,可以由系统自动回收资源
2、设置可分离线程
- 调用函数pthread_detach,将线程设转换为可分离线程
- 在创建时设置为可分离线程,初始化线程属性结构体变量(pthread_attr_init),设置为可分离状态(pthread_attr_setdetachstate),结构体变量地址传入pthread_creat,销毁初始化属性(pthread_attr_destroy)
pthread_detach函数原型:
int pthread_detach(pthread_t pid);
pid:要分离的线程ID。
pthread_attr_setdetachstate函数原型:
int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate)
detachstate:PTHREAD_CREAT_DETACHED 或者 PTHREAD_CREAT_JOINABLE