Linux 线程控制 —— 线程清理 pthread_cleanup_push

news2024/9/29 21:25:23

主线程可以通道 pthread_cancel 主动终止子线程,但是子线程中可能还有未被释放的资源,比如malloc开辟的空间。如果不清理,很有可能会造成内存泄漏。

// 子线程回调函数
void* thread_run(void* args)
{
    int* p = (int*)malloc(100);      // 动态开辟内存
    pthread_testcancel();            // 设置取消点

    free(p);
    p = NULL;
    // ...
}

因此,为了避免这种情况,于是就有了一对线程清理函数 pthread_cleanup_push 和 pthread_cleanup_pop 。两者必须是成对存在的,否则无法编译通过


        目录

1、pthread_cleanup_push

2、pthread_cleanup_pop

3、实际应用

(1) 子线程主动退出 (pthread_exit)

(2) 子线程被主线程取消 (pthread_cancel)

(3) pthread_cleanup_pop的参数为非0值 


1、pthread_cleanup_push

pthread_cleanup_push 的作用是创建栈帧,设置回调函数,该过程相当于入栈。回调函数的执行与否有以下三种情况:

  • 线程被取消的时候(pthread_cancel)
  • 线程主动退出的时候(pthread_exit)
  • pthread_cleanup_pop的参数为非0值(pthread_cleanup_pop)

第一个参数 routine:回调清理函数。当上面三种情况的任意一种存在时,回调函数就会被调用

第二个参数 args:要传递个回调函数的参数

2、pthread_cleanup_pop

pthread_cleanup_pop 函数的作用是执行回调函数 或者 销毁栈帧,该过程相当于出栈。根据传入参数的不同执行的结果也会不同。

当 execute = 0 时, 处在栈顶的栈帧会被销毁,pthread_cleanup_push的回调函数不会被执行

当 execute != 0 时,pthread_cleanup_push 的回调函数会被执行。

3、实际应用

pthread_cleanup_push 和pthread_cleanup_pop 必须是成对存在的,否则无法编译通过。

(1) 子线程主动退出 (pthread_exit)

这里 pthread_cleanup_pop 函数的放置位置和参数需要注意:

  • 必须放在 pthread_exit 后面,否则pthread_cleanup_pop会先清除栈帧,pthread_exit就无法调用清理函数了。
  • pthread_cleanup_pop的参数是 0,因为pthread_cleanup_pop的参数为非0值时也会调用回调清理函数。
void* pthread_cleanup(void* args){
	printf("线程清理函数被调用了\n");
}

void* pthread_run(void* args)
{
	pthread_cleanup_push(pthread_cleanup, NULL);

	pthread_exit((void*)1);     // 子线程主动退出
	pthread_cleanup_pop(0);     // 这里的参数要为0,否则回调函数会被重复调用
}

int main(){
	pthread_t tid;
	pthread_create(&tid, NULL, pthread_run, NULL);
	sleep(1);

	pthread_join(tid, NULL);
	return 0;
}

(2) 子线程被主线程取消 (pthread_cancel)

这里 pthread_cleanup_pop 的放置位置和参数 同上。

void* pthread_cleanup(void* args){
	printf("线程清理函数被调用了\n");
}

void* pthread_run(void* args)
{
	pthread_cleanup_push(pthread_cleanup, NULL);

	pthread_testcancel();       // 设置取消点
	pthread_cleanup_pop(0);     // 这里的参数要为0,否则回调函数会被重复调用
}

int main(){
	pthread_t tid;
	pthread_create(&tid, NULL, pthread_run, NULL);
	pthread_cancel(tid);        // 取消线程
	sleep(1);

	pthread_join(tid, NULL);
	return 0;
}

(3) pthread_cleanup_pop的参数为非0值 

void* pthread_cleanup(void* args){
	printf("线程清理函数被调用了\n");
}

void* pthread_run(void* args)
{
	pthread_cleanup_push(pthread_cleanup, NULL);

	pthread_cleanup_pop(1);     // 这里的参数为非0值
}

int main(){
	pthread_t tid;
	pthread_create(&tid, NULL, pthread_run, NULL);
	sleep(1);

	pthread_join(tid, NULL);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中小企业选择ERP系统时应关注的10个关键功能

现代ERP系统是帮助企业实现提高生产力、增加盈利能力和提高竞争力的目标的好帮手。该类软件旨在满足中小企业不断增长的业务需求,可确保整个企业的健康发展。 每天都有新的ERP功能和应用程序进入市场,如何明智选择至关重要。以下是中小企业在选择现代ERP…

Elasticsearch_第2章_ elasticsearch基础

Elasticsearch_第2章_ elasticsearch基础 文章目录Elasticsearch_第2章_ elasticsearch基础0.学习目标1.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例1.2.4.总结1.3.精准查询1.3.1.term查询1.3.2.range查询1.3.3.总结1.4.地理坐标查询1.…

SSM+JSP实现《吃货联盟外卖系统》

🍅程序员小王的博客:程序员小王的博客 🍅程序员小王的资源博客:http://wanghj.online/ 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎…

上海亚商投顾:沪指冲高回落 纺织服装股午后集体走强

上海亚商投顾前言:无惧大盘大跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪沪指今日缩量震荡,以中字头为首的权重股走低,上证50午后一度跌近1%,创业板指较为…

秋招|阿里测试开发岗面经(一共七次面试)

三月份的时候投了阿里的实习,然后基本上是一周面一次,前前后后一个月。实习通过了,但是后面因为有事,所以没能去成暑期实习,部门leader人很好,说是可以在秋招的时候再补上终面,于是就有了一共七…

jQuery easyui源码赏析

引子 jQuery未过时,在一些中小网站中,jQuery还是发挥着瑞士军刀的作用。我们不能为了前后端分离而分离,一些很简单的需求,很简单的页面,freemarkerjQuerybootstrap就能搞掂,奈何一定要搬动vue和react这些大…

[附源码]计算机毕业设计影评网站系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【雷达回波】基于matlab天气观测极化雷达回波仿真【含Matlab源码 2252期】

⛄一、天气观测极化雷达回波仿真简介 本示例展示了如何模拟满足天气观测要求的极化多普勒雷达回波。雷达在天气观测、灾害检测、降水分类和量化以及预报方面发挥着关键作用。此外,极化雷达以前所未有的质量和信息提供多参数测量。此示例演示如何模拟扫描分布式天气…

Java项目:ssm+jsp实现手机WAP版外卖订餐系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 这是一款由jspssm框架(spring、springMVC、mybaits)实现的手机WAP版外卖订餐系统。 本系统前台页面是手机端的&#xf…

如何发布一个 npm 包

前言 npm(node package manager)作为 Node.js 的包管理工具,让世界各地的 JavaScript 开发者方便复用、分享代码以及造轮子;本文将介绍如何发布一个 npm 包,以及使用工具来自动化管理发布 npm 包;本文总览…

Java代码审计——WebGoat CSRF (上)

目录 前言: (一)CSRF 0x01、简单介绍 0x02、实际案例 1.对 Referer 过滤不严导致的 CSRF 漏洞 2.token 可重用导致 CSRF 漏洞 3、webGoat中的CSRF 0x03 防御 3.1 STP 3.2 检查 Referer 字段 3.3 检查 Referer…

GMO Research 2022年旅游调查:旅游业有望强劲增长

GMO Research (TOKYO: 3695)最近进行的一项旅行调查显示,随着边境再次开放,亚洲正在逐渐恢复正常的旅行模式。尽管该地区仍没有达到疫情前水平,旅行者仍持谨慎态度,但他们对海外旅行的兴趣显著增加。 为了解旅行模式和旅行意愿&a…

Intel OpenVINO 安装显卡驱动

背景: 使用集合诚KMDA-3301 OpenVINO CPU和GPU 算法加速,用GPU加速时,调动不起来。写下解决过程,以备后用。 过程: 调动GPU 报错: terminate called after throwing an instance of InferenceEngine::G…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校师生党建管理系统4d8du

最近大四学弟学妹们开始准备设计了,有一些问题问我,比如设计怎么做,有没有模板等等吧,大家都没有去学校,老师都是通过远程指导的,答辩也是远程答辩,这种情况下同学们不在一起,可能碰…

day13【代码随想录】环形链表II、环形链表、快乐数、各位相加、丑数、丑数||

文章目录一、环形链表 II(力扣142)二、环形链表(力扣141)三、快乐数(力扣202)四、各位相加(力扣258)五、丑数(力扣263)六、丑数||(力扣264&#x…

JavaScript:File API和Blob API

web应用的痛点就是不能操作计算机上的文件。File API和Blob API可以安全访问到客户端上的文件。 File类型 现在我们可以在html表单中直接访问文件&#xff0c;比如&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

PaddleOCR服务部署-并通过Java进行调用

上一篇讲了PaddleOCR的简单使用&#xff0c;但是最终的目的肯定是要将它进行服务部署方便我们调用的&#xff0c;这里介绍一下他的服务部署方式 选择部署方式 官方推荐有以下几种&#xff1a; Python 推理 C 推理 Serving 服务化部署&#xff08;Python/C&#xff09; Paddle…

电影寒冬之下,票房靠“主旋律”能撑住场吗?《扫黑行动》仍在重播

春节将近&#xff0c;各大院线陆陆续续公布了春节档将要上映的影片档期&#xff0c;小伙伴们是不是也对近期热门的影片有了兴趣&#xff0c;想要一饱眼福了呢。下面是小编根据网络公布的数据进行报表数据处理分析后得到的数据可视化图&#xff0c;展示了近期一些热门影片的情况…

数据库专辑--WITH CHECK OPTION的用法

系列文章 C#底层库–数据库访问帮助类&#xff08;MySQL版&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126886379 文章目录系列文章前言一、概念介绍二、测试用例2.1 数据准备2.2 数据查询2.3 修改视图&#xff0c;加上WITH CHECK O…

IDEA 优质 插件 Translation 跟随 IDEA 2022.3 版 更新翻译引擎啦

IDEA 优质 插件 Translation 跟随 IDEA 2022.3 版 更新翻译引擎啦 文章目录IDEA 优质 插件 Translation 跟随 IDEA 2022.3 版 更新翻译引擎啦特征安装使用 IDE 内置插件系统安装&#xff1a;手动安装&#xff1a;使用1. 注册翻译服务&#xff08;可选&#xff09;2. 开始翻译3.…