多线程(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。

猜你喜欢

转载自blog.csdn.net/lqy971966/article/details/120998265