news 2026/6/26 8:56:38

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
飞凌嵌入式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 的清理函数。在此过程中,线程的清理函数可以根据条件执行或仅从清理栈中移除。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 8:55:22

UV色浆耐光性与耐候性评估:UV涂膜颜色持久性的保障

UV色浆的耐光性和耐候性是影响UV涂膜颜色持久性的关键指标。UV涂装以其高效率和高品质著称&#xff0c;但如果色浆耐光性不足&#xff0c;涂膜颜色在光照下逐渐褪变&#xff0c;将严重影响家具的外观品质和品牌形象。本文系统评估UV色浆的耐光性和耐候性。一、UV涂膜的耐光性特…

作者头像 李华
网站建设 2026/6/26 8:48:30

TypeTraits类型萃取全解,STL原生类型特性、编译期类型判断、属性萃取、迭代器特性、工程高阶泛型落地实战

0. 前言我们彻底吃透了 std::enable_if 条件模板体系&#xff0c;掌握了基于 SFINAE 的编译期条件筛选、三种约束写法、多条件组合匹配、类模板偏特化联动&#xff0c;以及 if constexpr 与 enable_if 的工程选型规范&#xff0c;彻底具备了可控、安全、零开销的泛型约束能力。…

作者头像 李华
网站建设 2026/6/26 8:47:29

HACS集成部署与故障排除技术指南:架构解析与性能优化方案

HACS集成部署与故障排除技术指南&#xff1a;架构解析与性能优化方案 【免费下载链接】integration HACS gives you a powerful UI to handle downloads of all your custom needs. 项目地址: https://gitcode.com/gh_mirrors/in/integration HACS&#xff08;Home Assi…

作者头像 李华
网站建设 2026/6/26 8:46:50

HC32L130国产MCU开发实战:从固件库解析到低功耗设计

1. 项目概述&#xff1a;从一串神秘代码到国产MCU的深度探索拿到“hdsc.hc32l130.1.0.1”这串字符&#xff0c;很多刚接触嵌入式开发的朋友可能会一头雾水。这看起来像是一个文件名&#xff0c;或者某个软件的版本号。但对于我们这些常年混迹在单片机一线的工程师来说&#xff…

作者头像 李华
网站建设 2026/6/26 8:44:23

如何设计一个支持“秒杀”活动的系统?

如何设计一个支持“秒杀”活动的系统&#xff1f; 在电商领域&#xff0c;“秒杀”活动是一种常见的促销手段&#xff0c;能够在短时间内吸引大量用户抢购限量商品。高并发、低延迟和系统稳定性是设计这类系统时面临的巨大挑战。本文将介绍如何设计一个支持“秒杀”活动的系统…

作者头像 李华