线程状态:分离状态(detached)与可结合状态(joinable)
1、在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。
一个可结合的线程能够被其他线程收回其资源和杀死;在被其 他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
2、线程的分离状态决定一个线程以什么样的方式来终止自己。
在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当 pthread_join()
函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
而分离线程不是这样子的,它没有被其他的线程所等待,自己运 行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。所以如果我们在创建线程时就知道不需要了解线程的终止状 态,则可以pthread_attr_t
结构中的detachstate线程属性,让线程以分离状态启动。
3、设置线程分离状态的函数为pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
。第二个参数可选为PTHREAD_CREATE_DETACHED
(分离线程)和PTHREAD _CREATE_JOINABLE
(非分离线程)。这里要注意的一点是,如果设置一个线程为分离线程,而这个线程运行又非常快,它很可能在 pthread_create
函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create
的 线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施,最简单的方法之一是可以在被创建的线程里调用 pthread_cond_timewait
函数,让这个线程等待一会儿,留出足够的时间让函数pthread_create
返回。设置一段等待时间,是 在多线程编程里常用的方法。但是注意不要使用诸如wait()之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。
4、另 外一个可能常用的属性是线程的优先级,它存放在结构sched_param
中。用函数pthread_attr_getschedparam和函数 pthread_attr_setschedparam
进行存放,一般说来,我们总是先取优先级,对取得的值修改后再存放回去。
5、线程等待——正确处理线程终止
#include <pthread.h>void pthread_exit(void *retval);void pthread_join(pthread_t th,void *thread_return);//挂起等待th束,*thread_return=retval;int pthread_detach(pthread_t th);
如果线程处于joinable状态,则只能只能被创建他的线程等待终止。
在 Linux平台默认情况下,虽然各个线程之间是相互独立的,一个线程的终止不会去通知或影响其他的线程。但是线程处于joinable状态下,已经终止的线程的资源并不会随着线程的终止而得到释放,我们需要调用 pthread_join() 来获得另一个线程的终止状态并且释放该线程所占的资源。
调用该函数的线程将挂起,等待 th 所表示的线程的结束。 thread_return
是指向线程 th 返回值的指针。需要注意的是 th 所表示的线程必须是 joinable 的,即处于非 detached(分离)状态;并且只可以有唯一的一个线程对 th 调用pthread_join()
。如果 th 处于 detached 状态,那么对 th 的 pthread_join()
调用将返回错误。
如果不关心一个线程的结束状态,那么也可以将一个线程设置为 detached 状态,从而让操作系统在该线程结束时来回收它所占的资源。
6、将一个线程设置为detached 状态可以通过两种方式来实现。一种是调用 pthread_detach() 函数,可以将线程 th 设置为 detached 状态。另一种方法是在创建线程时就将它设置为 detached 状态,首先初始化一个线程属性变量,然后将其设置为 detached 状态,最后将它作为参数传入线程创建函数 pthread_create(),这样所创建出来的线程就直接处于 detached 状态。
创建 detach 线程:
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);
总之为了在使用 pthread 时避免线程的资源在线程结束时不能得到正确释放,从而避免产生潜在的内存泄漏问题,在对待线程结束时,要确保该线程处于 detached 状态,否着就需要调用 pthread_join() 函数来对其进行资源回收。
线程状态:分离状态(detached)与可结合状态(joinable)相关推荐
- 线程的状态:分离(detached)和joinable(可结合的)
线程分离 在任意一个时间点上,线程是可结合(joinable)或者是可分离的(detached).一个可结合线程是可以被其他线程收回资源和杀关闭.在被回收之前,他的存储器资源(栈等)是不释放的.而对于 ...
- APUE 线程的分离状态
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反, ...
- 请详细描述一下线程从创建到死亡的几种状态都有哪些?
请详细描述一下线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象的 star ...
- 线程的生命周期及五种基本状态介绍
一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌 ...
- 多线程(六)线程的五大生命周期,六个状态,七种基础状态
关于线程的六个状态可以看一下:Java线程的6个状态 建议先看一下上面的文章,再看下面的文章. 线程的五大生命周期 NEW: 线程新建状态 RUNNABLE: 就绪状态 RUN ...
- 【Boost】boost库中thread多线程详解12——线程的分离与非分离
Boos::thread线程的默认属性为非分离状态,线程结束后线程标识符.线程退出状态等信息需要通过join方法回收. boost::thread thread_func(func); thread_ ...
- linux ethtool_glink 获取无线网卡状态,ethtool 读到的状态与 dpdk 读到的网卡状态不一致...
ethtool 读到的链接状态 使用 ethtool 读取网卡链接状态的一个示例如下: longyu@longyu-pc:~$ sudo /sbin/ethtool ens37 [sudo] pass ...
- linux 网络端口状态,Linux下用netstat查看网络状态、端口状态(转)
转:http://blog.csdn.net/guodongdongnumber1/article/details/11383019 在linux一般使用netstat 来查看系统端口使用情况步. n ...
- boost::statechart模块实现使用正交状态和 state_downcast 查询正交区域的状态的测试程序
boost::statechart模块实现使用正交状态和 state_downcast 查询正交区域的状态的测试程序 实现功能 C++实现代码 实现功能 boost::statechart模块实现使用 ...
- 宝塔linux面板负载状态过高,宝塔Linux面板负载状态CPU100%怎么解决
站长朋友们在日常运营网站的时候或多或少会遇到一些奇奇怪怪的事情发生,应急事情的处理能力也是必不可少的,遇到突发情况一定要淡定,切莫慌张,凡事都有对应的解决办法的,要相关办法总比困难多哦.今天所要分享的 ...
最新文章
- 【Android UI设计与开发】第04期:引导界面(四)仿人人网V5.9.2最新版引导界面
- LeetCode59 Spiral Matrix II
- 论文阅读课1-Attention Guided Graph Convolutional Networks for Relation Extraction(关系抽取,图卷积,ACL2019,n元)
- excel 公式 平移 引用单元格_不学会这3个Excel隔列求和函数公式,你只能一个个单元格去相加...
- mysql如何重复_mysql 处理重复数据
- python性能测试台_性能测试平台效率优化的一次经验(python版)
- Go中error类型的nil值和nil
- Many to many example - 1 of 4
- TP5模型修改器和读取器
- 【百度地图API】建立全国银行位置查询系统(二)——怎样为地图添加控件
- SpringAOP底层API之代理对象执行流程
- 什么是蒙特卡罗仿真?
- AI——六(图层、蒙版)
- pr导入无法打开磁盘上的文件_为什么用pr导入视频显示文件导入失败?
- Direct3D 11 Devices 之 Using Direct3D 11 feature data to supplement Direct3D feature levels
- 微信缓存dat怎么转图片_PC微信dat怎么转图片?
- 墨刀怎么注册_墨刀的使用
- Android开发和安全系列工具
- 前端,通过面试去学习,综合(面试总结整理)
- 关于有氧运动的误区 你知道几个