多线程(19)线程分离/脱离,结合 pthread_detach
1. 线程的两种状态——可结合、可分离
线程分为两种状态:可结合态和分离态;默认情况下,线程被创建成可结合的。
1.1 可结合态(线程的默认属性):
这种状态下的线程是能够被其他进程回收其资源或杀死的。
在被其他线程回收之前,它的存储器资源(如栈)是不释放的。
这句话我的理解是:与其说它能够被其他进程回收或杀死,不如说它需要被其他进程回收或杀死;当它在被其他线程回收之前,它的存储器资源(如栈)是不会释放的;
这跟子进程很相似,如果不用父进程wait回收的话,就会变成僵尸进程同理,如果一个可结合态线程不用pthread_join回收,则会变成类似僵尸进程
线程的默认属性,即为非分离状态(即可结合的,joinable,需要回收),这种情况下,原有的线程等待创建的线程结束;只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
1.2 分离态
这种状态下的线程是不能够被其他线程回收或杀死的,它的存储资源在它终止时由系统自动释放。
为了避免存储器泄漏,每个可结合线程需要显示的调用pthread_join回收;要么就将其变成分离态的线程
2. 线程分离函数:pthread_detach
#include <pthread.h>
int pthread_detach(pthread_t thread);
//将pthread_thread对应的线程设为分离态的线程
2.1 pthread_detach 的两种用法:
新线程中写:pthread_detach(pthread_self());
主线程中写:pthread_detach(thread);
第一种方法是将自己从这些线程中分离出来;
第二种方法是将指定的线程从这些线程中分离出去。
简单来说就是,一个是自己把自己弄出去,一个是让别人把自己弄出去
3. 创建分离线程伪代码:
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, THREAD_FUNCTION, arg);
4. pthread_attr_XXX 系列api
#include <pthread.h>
int pthread_attr_getdetachstate(const pthread_attr_t * attr, int * detachstate);
int pthread_attr_setdetachstate(pthread_attr_t * attr, int detachstate);
int pthread_attr_destroy(pthread_attr_t *attr);
参数:
attr:线程属性变量,
detachstate:分离状态属性
PTHREAD_CREATE_DETACHED 分离状态启动
PTHREAD_CREATE_JOINABLE 结合
返回值:
若成功返回0,若失败返回-1。