ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多线程(19)线程分离/脱离,结合 pthread_detach

2021-10-27 17:58:42  阅读:255  来源: 互联网

标签:多线程 attr 19 分离 回收 线程 pthread detach


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

标签:多线程,attr,19,分离,回收,线程,pthread,detach
来源: https://blog.csdn.net/lqy971966/article/details/120998265

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有