当前位置: 首页 > news >正文

飞凌嵌入式ElfBoard-线程之线程清理

类似于atexit()函数注册进程终止处理函数,当进程调用 exit()退出时就会执行进程终止处理函数;当线程退出时也会调用线程清理的相关函数。

在多线程编程中,当一个线程退出时,可以使用 pthread_cleanup_push()和 pthread_cleanup_pop()来注册和弹出清理函数。这些清理函数在线程正常结束或响应取消请求时自动调用,用于释放资源或执行特定的清理操作。

1.pthread_cleanup_push

可以将一个清理函数 routine 入栈。当线程退出或被取消时,所有入栈的清理函数会按照后进先出的顺序执行,确保资源的有序释放。

1)头文件

#include <pthread.h>

2)函数原型

void pthread_cleanup_push(void (*routine)(void *),void *arg);

3)参数

routine:指向要在线程退出时执行的清理函数的指针。清理函数应该接收一个 void * 类型的参数。

arg:传递给清理函数 routine 的参数。

4)返回值

无。

2.pthread_cleanup_pop

可以将 pthread_cleanup_push 入栈的清理函数出栈。如果 execute 为非零值,则会立即执行该清理函数;如果 execute 为零,则仅从栈中移除,不执行清理函数。

1)头文件

#include <pthread.h>

2)函数原型

void pthread_cleanup_pop(int execute);

3)参数

execute:为非零值时会立即执行上一个 pthread_cleanup_push 注册的清理函数;如果为零,则不会调用清理函数。

4)返回值

5)注意情况

pthread_cleanup_push 和 pthread_cleanup_pop 必须在同一个函数作用域内配对使用,否则会导致编译错误。

pthread_cleanup_pop(1) 会立即执行清理函数,而 pthread_cleanup_pop(0) 仅从栈中移除注册的清理函数而不执行。

如果线程在 pthread_cleanup_pop 之前因取消或调用 pthread_exit 退出,清理函数会自动执行。

6)示例:线程清理函数的使用

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

void cleanup(void *arg) {

printf("Cleaning up: %s\n", (char *)arg);

}

void *thread_func(void *arg) {

pthread_cleanup_push(cleanup, "Resource 1");

pthread_cleanup_push(cleanup, "Resource 2");

printf("Thread is running\n");

// 模拟一些操作或阻塞

sleep(2);

// 出栈但不执行第一个清理函数

pthread_cleanup_pop(0);

// 出栈并立即执行第二个清理函数

pthread_cleanup_pop(1);

return NULL;

}

int main() {

pthread_t thread;

pthread_create(&thread, NULL, thread_func, NULL);

pthread_join(thread, NULL);

return 0;

}

7)运行结果

Thread is running

Cleaning up: Resource 1

8)代码解析

pthread_cleanup_pop(0) 仅移除了 Resource 2 的清理函数而不执行,而 pthread_cleanup_pop(1) 则执行了 Resource 1 的清理函数。在此过程中,线程的清理函数可以根据条件执行或仅从清理栈中移除。

http://www.jsqmd.com/news/1080382/

相关文章:

  • QuickLoo:让Windows拥有Mac同款空格键秒预览神器,堪称“效率救星“!
  • Cilium VXLAN 模式使用说明
  • 项目名称:简易全栈博客系统
  • 外区域拉格朗日平均曲率方程:存在性、渐近行为与函数空间方法
  • 百度网盘直链解析:免费提速50倍的终极解决方案
  • 智慧水利监测系统集成难题破解:多协议 RTU 的多设备兼容与落地实践
  • 测试工程师如何利用New Relic实现数据驱动的性能监控与瓶颈定位
  • VMware上部署Nginx的7大避坑指南:20年运维专家亲授,90%新手踩过的配置雷区
  • 富文本编辑器安全防护:从XSS防御到wangEditor实战配置
  • 从Prompt到Agent工作流:大模型客服系统能力升级的三个技术断点
  • Windows系统文件d3dx10_40.dll丢失找不到问题解决
  • 经验分享:适用于小白的简历撰写攻略
  • 高维空间球体覆盖与堆积:从Vitali引理到算法实践
  • 5分钟快速上手:ChanlunX缠论分析插件完整使用指南
  • NVIDIA Profile Inspector中文界面终极指南:5步解锁显卡调校新体验
  • 终极指南:如何用Marketch插件5分钟完成Sketch设计稿转HTML代码
  • AWS 基础笔记(二)
  • 一文讲透|盘点2026年实力封神的的AI论文平台
  • VMware中搭建Python开发环境:3种主流方案对比+性能压测数据,选错方案=多花200%调试时间
  • 2026电钢琴选购指南:3项核心指标+7款热门机型实测推荐
  • 百度网盘提取码智能查询工具:3分钟快速获取分享密码的完整指南
  • 接口实战笔记:CAN/CAN FD——从波特率到BusOff,车载与军工场景下到底测什么、难在哪
  • 基于Docker与vLLM从零部署AI编程导师DeepTutor实战指南
  • 不会编程如何开发App?适合创业者的AI开发工具推荐
  • LinkSwift网盘直链下载助手:九大平台API解析技术实现与应用指南
  • Γ-switch Ramsey数:群论与图论交叉下的动态着色新模型
  • VMware虚拟机部署Nginx后响应延迟飙升?深度剖析vmxnet3驱动、TCP offload与Nginx worker进程绑定的协同优化方案
  • Wedecode:微信小程序安全审计与代码还原的技术突破
  • 用 OpenClaw 将 CSDN 博客自动整合为技术电子书(附 PDF/EPUB 导出脚本)
  • GB/T 4857.7-2005正弦定频振动试验标准浅析