线程的状态----joinable和detached

系统编程06-(pthread_attr_init、pthread_attr_setdetachstate、pthread_attr_destroy、pthread_detach......) pthread_attr_init、pthread_attr_setdetachstate、pthread_attr_destroy、pthread_detach、pthread_self、pthread_cancel、pthread_setcancelstate、pthread_setcanceltype、pthread_cleanup_push、pthread_cleanup_pop、sem_open、sem_wait、sem_post、sem_close、sem_unlink、sem sem_init 阅读详情

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

》

线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。所以如果我们在创建线程时就知道不需要了解线程的终止状态,则可以pthread_attr_t结构中的detachstate线程属性,让线程以分离状态启动。

》

设置线程分离状态的函数为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()之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。

》

另外一个可能常用的属性是线程的优先级,它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数pthread_attr_setschedparam进行存放,一般说来,我们总是先取优先级,对取得的值修改后再存放回去。

线程等待——正确处理线程终止

#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平台默认情况下,虽然各个线程之间是相互独立的,一个线程的终止不会去通知或影响其他的线程。但是已经终止的线程的资源并不会随着线程的终止而得到释放,我们需要调用 pthread_join() 来获得另一个线程的终止状态并且释放该线程所占的资源。(说明:线程处于joinable状态下)

调用该函数的线程将挂起,等待 th 所表示的线程的结束。 thread_return 是指向线程 th 返回值的指针。需要注意的是 th 所表示的线程必须是 joinable 的,即处于非 detached(游离)状态;并且只可以有唯一的一个线程对 th 调用 pthread_join() 。如果 th 处于 detached 状态,那么对 th 的 pthread_join() 调用将返回错误。

如果不关心一个线程的结束状态,那么也可以将一个线程设置为 detached 状态,从而让操作系统在该线程结束时来回收它所占的资源。将一个线程设置为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

线程分离状态 在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。         线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况 阅读详情

相关推荐

RTX5线程退出osThreadExit的两种模式详解:Detached与Joinable到底怎么选?

本文深入解析RTX5实时操作系统中线程退出的两种模式——Detached与Joinable,详细对比其内存管理、状态转换及适用场景。通过实战案例和决策框架,帮助开发者在嵌入式系统中优化线程生命周期管理,提升资源利用率和系统稳定性。

weixin_34168834的博客 253

pthread_attr_setdetachstate

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。一、pthread_join函数pthread_join函数        函数原型:int pthread_joi...

明潮的BLOG 1万+

多线程的socket编程

文章目录一、线程二、流程图三、详细说明1、创建线程2、pthread_creat()三、示例代码 一、线程 上次我们聊到了多进程的编程,对于一台主机运行一个进程是需要耗费很多系统资源,这时候我们就可以选择多线程来解决问题。,线程是进程的一条执行路径。线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进 程,但却可以看作是Unix进程的表亲,所有的线程都是在同一进程空间运行,这也意味着多条线...

longyongtu13@qq.com 840

【C/C++】多线程从入门到进阶

thread:线程ID,通过 pthread_t 定义。 attr:线程属性,可以为线程设置各种属性,详情见附录。默认设置为NULL,表示使用默认的属性,即主子线程之间是可接合的。 start_routine:子线程函数,必须是 void *func(void *) arg:子线程函数的参数,必须是 void *,如果需要其他类型,在引入参数时强转类型即可。 输出结果: 第一步:代码创建了线程,第二个参数 attr 线程属性设置为 NULL,表示子线程与主线程是可接合的,子线

赖东东_的博客 1869

RTX5线程退出osThreadExit实战:Detached与Joinable模式到底怎么选?附代码避坑

本文深入解析RTX5线程退出机制中Detached与Joinable模式的选择策略,通过代码示例和内存管理分析,帮助开发者避免资源泄漏陷阱。重点探讨了`osThreadExit`API在不同模式下的行为差异,并提供了实用的避坑指南和最佳实践。

weixin_32006655的博客 284

【Linux】pthread_attr_setdetachstate设置线程分离

非分离线程在终止后,必须要有一个线程用 join 来等待它。否则,不会释放该线程的资源以供新线程使用,而这通常会导致内存泄漏。因此,如果不希望线程被等待,请将该线程作为分离线程来创建。

郭老二 564

线程的状态:分离(detached)和joinable(可结合的)

线程分离 在任意一个时间点上,线程是可结合(joinable)或者是可分离的(detached)。一个可结合线程是可以被其他线程收回资源和杀关闭。在被回收之前,他的存储器资源(栈等)是不释放的。而对于detached状态的线程,其资源不能被别的线程收回和关闭,只有等到线程结束才能由系统自动释放 默认情况,线程状态被设置为结合的。所以为了避免资源泄漏等问题,一个线程应当是被显示的join或者deta...

deniece1的博客 1870

【Qualcomm高通音频】如何封装音频控件?

音频代码涉及面很广,这篇文档介绍如何封装音频控件给HAL层使用。这里以AW87519芯片调试为例进行介绍封装音频控件和使用的方法。在最初接出到高通音频基础功能调试的时候,都是从tinyalsa指令/mixer_paths文件配置开始。因为单独一个音频设备的调试,都对应一条音频链路的打通。比如以下链接上高通平台基础音频输入输出设备调试: 【Qualcomm音频】Speaker 调试记录http...

crow_ch的博客 1954

linux应用编程-多线程

的线程可以在终止时释放资源,这样创建它的线程就不用通过pthread_join来等待接收。的线程必须在创建它的线程中使用。线程的API都在头文件。回收,否则会有资源未释放。

鄭高兴 347

Mac微信聊天记录备份终极指南:用软链接轻松迁移到外接硬盘(附重签名教程)

本文详细介绍了如何通过软链接技术将Mac微信聊天记录备份迁移到外接硬盘,解决内置存储空间不足的问题。教程包括备份文件定位、软链接创建及微信重签名步骤,帮助用户高效管理微信数据,释放Mac存储空间。

uuu88的博客 1163

电机控制易混知识点1-基波频率/载波频率/采样频率

在电机控制学习工作中会接触到很多专业名词,其中基波频率,载波频率,采样频率是最常接触到的,特别对于电机控制小白开说,不容易理解,现对这几个概念做下总结归纳。

新能源电机控制工程师 | 聚焦实战问题,搭建互助平台 分享电机控制代码调试、现场故障排查、算法优化中的真实困惑;开放讨论电机基础知识以及工作中遇到难点等共性难题。拒绝单向输出,只做工程师的“技术树洞”与“解忧杂货铺”! 2191

多线程中thread::join()和thread::detach()的区别

       你应该使用join还是detached? 一般都使用join 除非你需要更灵活并且想要独立地提供一种同步机制来等待线程完成,在这种情况下你应该使用detach    C++中的thread对象是指执行的线程(thread of execution),这是系统性或平台性的概念。     当执行thread::join()时,子线程就会阻塞主线程,当thread::join()结...

zhong29的博客 3253

【用unity实现100个游戏之7】实现一个类《杀戮尖塔》的卡牌回合制游戏(附项目源码)

【用unity实现100个游戏之7】实现一个类《杀戮尖塔》的卡牌回合制游戏(附项目源码)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

C++ thread

0.线程的基础知识 0.1 线程的状态 0.2 c++线程的joinable和detached状态 joinable 一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。 detached 一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 ...

weixin_30750335的博客 161

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)。

非科班Java出身GISer的博客 702

Excel 汉字首字母提取:四种方案对比与选型

本文对比了 Excel 中提取汉字首字母的四种方案:手动转换、VBA 脚本、映射表与 AI 工具。手动方式低效易错;VBA 适合无网环境但识别范围有限;映射表精度提升却无法解决多音字;AI 工具通过语义理解可一句话完成提取,是多数场景下的首选。

u011186532的专栏 394

Linux中线程相关API函数的定义及使用

1

ArtAndLife的博客 584

015:机载三维激光扫描技术相关知识

机载三维激光扫描系统(LiDAR)是集激光、GPS、INS等尖端技术于一体的三维航空遥感技术,能高效准确获取地表三维信息。该系统由GPS、INS、激光扫描测距系统、成像装置和工作平台组成,各部件协同工作以获取精确的空间定位、运动状态、地表三维坐标及真实色彩信息。通过制定飞行计划、安置GPS基站、激光扫描测量、惯性测量及获取高清数码影像等步骤,机载LiDAR技术能实时获取大范围高精度三维数据。该技术具有扫描速度快、精度高、全数字特征等优势,广泛应用于测绘、工程、环境监测和城市建设等领域,如城市三维模型重建、灾

qq_31762031的博客 1726

线程的状态--joinable、detached

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。           线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情

ymangu的专栏 1909

Darknet-Yolov3 移植过程

本教程面向使用寒武纪平台进行深度学习推理任务的开发者。针对当前主流检测网络darknet-yolov3,进行寒武纪平台的移植。开发者对照移植过程,能够利用寒武纪智能处理器设备完成多种场景的目标检测任务。本实验代码基于 Neuware 1.6.1 与 Python 2.7 环境。

shengyin714959的博客 438

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

多线程编程--线程属性之线程的状态

文章目录线程的结合状态与分离状态线程的状态操作函数 线程的结合状态与分离状态 在任何时间点上,线程都是 可结合的(Joinable) 或者 分离的(Detached)。 如果线程是 结合状态,那么此线程可以被其他线程杀死并回收资源;在被其他线程回收之前,它的存储器资源(例如栈)是不释放的; 如果线程是 分离状态,那么此线程不能被其他线程终结并回收资源;他的存储器资源在它终止时由系统自动回收; ...

ZachZheng的专栏 207

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux线程

线程的状态 joinable(读音 找嗯的波)与detached(读音 第它吃特 分离线程) joinable线程结束资源不会回收 需要手动回收 detached线程结束可以回收资源 回收资源就是线程执行的方法中定义的描述符比如文件流、socket回收就是把它们的内存释放 pthread_join 函数对于joinable是有效的 对于detached是无效的 主控线程 跟进程一起启动的线程叫做主控线程 main线程指的主控线程 是一个逻辑线程程序中的线程,在java中的main线程是一个joinable类

计算机王的博客 570

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

线程状态:分离状态(detached)与可结合状态(joinable)

1、在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。 一个可结合的线程能够被其他线程收回其资源和杀死;在被其 他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 2、线程的分离状态决定一个线程以什么样的方式来终止自己。 在默认情况下线程是非分离状态的,这种情况下,

夜夜夜夜 2785

pthread的状态

一.pthread的2中状态: joinable状态:当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符,此时可以获得线程的执行结果,需要调用pthread_join方法释放资源。 unjoinable状态:当线程函数自己返回退出时或pthread_exit时都会自动释放线程所占用堆栈和线程描述符,此时不能够获得线程的执行结果。 二.pthread的设置方...

闯荡_脚印 1249
上一篇: 静态函数库与动态函数库(共享库)的创建
下一篇: UNIX网络编程之线程浅析
lm_123_456
博客等级 码龄11年 35粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值