线程清理处理函数 pthread_cleanup_push、pthread_cleanup_pop

M6 Mac mini涨价2500值不值?深度拆解硬件成本与购买决策 统一内存架构将CPU、GPU和内存封装在一起,通过共享高带宽内存池提升数据交换效率,尤其适合本地AI推理和视频渲染等场景。在苹果生态中,起步内存和存储的配置直接决定设备生命周期,因为后期无法自行升级。M6 Mac mini将起步内存从16GB提升至24GB、存储从256GB提升至512GB,同时芯片制程和GPU核心数均有升级,持续负载性能保持率明显改善。对于开发者、内容创作者和本地大模型推理用户,这些变化能转化为实际效率收益;而轻度办公用户则可能面临性能冗余。理解硬件成本结构与自身工作流需求,才能判断这25 阅读详情

原文:http://blog.youkuaiyun.com/yanook/article/details/6579955

线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。

    pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:
    1)调用pthread_exit。
    2)作为对取消线程请求(pthread_cancel)的响应。
    3)以非0参数调用pthread_cleanup_pop。
注意:

    1)如果线程只是由于简单的返回而终止的,则清除函数不会被调用。

    2)如果pthread_cleanup_pop被传递0参数,则清除函数不会被调用,但是会清除处于栈顶的清理函数。

 

名称:

pthread_cleanup_push / pthread_cleanup_pop

功能:

线程清理处理程序

头文件:

#include <pthread.h>

函数原形:

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

void pthread_cleanup_pop(int execute);

参数:

rtn 处理程序入口地址

arg 传递给处理函数的参数

返回值:

无

 

 

 

 

 

 

 

 

 

 

#include <stdio.h>  
#include <stdlib.h>  
#include <pthread.h>  
#include <string.h>  
 
void cleanup(void *arg){  
    printf("cleanup: %s/n",(char *)arg);  
}  
 
void *thr_fn1(void *arg){  
    printf("thread 1 start/n");  
    pthread_cleanup_push(cleanup,"thread 1 first handler");  
    pthread_cleanup_push(cleanup,"thread 1 second handler");  
    printf("thread 1 push complete/n");  
    if(arg)  
        return ((void *)1);  
    pthread_cleanup_pop(1);  
    pthread_cleanup_pop(1);  
    return ((void *)1);  
}  
 
void *thr_fn2(void *arg){  
    printf("thread 2 start/n");  
    pthread_cleanup_push(cleanup,"thread 2 first handler");  
    pthread_cleanup_push(cleanup,"thread 2 second handler");  
    printf("thread 2 push complete/n");  
    if(arg){  
        pthread_exit((void *)2);  
    }  
    pthread_cleanup_pop(0);  //取消第一个线程处理程序

    pthread_cleanup_pop(0);  //取消第二个线程处理程序
 
    pthread_exit((void *) 2);  
}  
 
int main(void){  
    int err;  
    pthread_t tid1,tid2;  
    void *tret;  
 
    err = pthread_create(&tid1,NULL,thr_fn1,(void *)1);  
    if( err != 0){  
        fprintf(stderr,"create thread1 failed: %s",strerror(err));  
        exit(1);  
    }  
 
    err = pthread_create(&tid2,NULL,thr_fn2,(void *)2);  
    if(err != 0){  
        fprintf(stderr,"create thread 2 failed: %s",strerror(err));  
        exit(1);  
    }  
 
    err = pthread_join(tid1,&tret);  
    if(err != 0){  
        fprintf(stderr,"thread1 join failed: %s",strerror(err));  
        exit(1);  
    }  
    printf("thread 1 exit code %d/n",(int)tret);  
    err = pthread_join(tid2,&tret);  
    if(err != 0){  
        fprintf(stderr,"thread2 join failed: %s",strerror(err));  
        exit(1);  
    }  
    printf("thread 2 exit code %d/n",(int) tret);  
    exit(0);   
} 


属性基加密(Attribute-based Encryption, ABE) KP-ABE中,用户的密钥定义了访问策略,密文的属性与策略进行匹配。CP-ABE中,密文定义了访问策略,用户的属性与策略进行匹配。 阅读详情

相关推荐

stm32入门 点亮TFTLCD(NT35510驱动)

正点原子stm32f407探索者开发板屏幕使用正点原子4.3寸TFTLCDstm32f407开发使用标准库本文参考正点原子例程和NT35510的data sheet,尽量使用最少的代码点亮屏幕。

tangliang_cn的博客 1981

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

Linux 线程控制 —— 线程清理

challenglistic的博客 5084

贴片二极管SOD封装详解:SOD-123/323/523尺寸焊盘设计要点

表面贴装技术中,二极管封装尺寸直接决定PCB布局与焊接可靠性。SOD封装作为小外形二极管的主流形态,其SOD-123、SOD-323、SOD-523三种规格分别对应不同的功耗与占板面积权衡。理解封装尺寸、焊盘设计计算逻辑和钢网开窗原理,是避免立碑、虚焊等工艺缺陷的关键。在可穿戴设备、电源保护等空间受限场景中,合理选择封装不仅能优化散热路径,还能提升量产良率。本文从焊盘计算、工艺要点到选型策略,全面解析SOD封装的工程实践。

weixin_42520780的博客 307

C++多线程之——pthread_cleanup_push与pthread_cleanup_pop

中,我们模拟了一些线程执行期间的操作,并在函数退出时执行清理函数。清理函数以相反的顺序执行,并打印出相应的清理信息。这些清理工作通常包括释放分配的资源或执行必要的操作,以确保线程退出时不会留下未完成的工作或资源泄漏。、返回从线程函数中等等)时,系统会自动执行清理函数堆栈中的清理函数。清理函数会以相反的顺序执行,即最后一个压入堆栈的函数会最先执行。这表示在线程退出时,将按照相反的顺序执行清理函数。类型的参数,用于传递给清理函数,以便它在执行时能够访问到需要清理的资源或数据。在这个示例中,我们使用。

ALL BE WELL的博客 937

船舶轨迹预测中的5个常见坑:基于LSTM单步预测的避坑实践

本文针对船舶轨迹预测中LSTM单步预测的常见问题,系统总结了五个典型陷阱及避坑实践。重点分析了如何正确处理AIS数据的非均匀采样与清洗、对航向角进行周期性编码、采用轨迹级归一化策略、缓解单步滚动预测的误差累积,并设计贴合业务的评估指标。这些实践能有效提升预测模型的准确性与实用性。

cnn8visionary的博客 632

深入解析Vortex GPGPU cache设计(2),关于cache_bank

本文分析了Vortex处理器的cache_bank模块设计,作为cache系列的第二部分。文章详细阐述了cache_bank的基本结构,包括地址位分配和默认配置参数。重点解析了cache的5种操作及其优先级。文章详细介绍了二级流水线设计,包括TAG/DATARAM的读写操作时序。

weixin_55313207的博客 1168

pthread_cleanup_push/pop

void pthread_cleanup_push(void (*routine)(void*), void *arg); void pthread_cleanup_pop(int execute);//这里的int参数,0是不执行push的内容,非0是执行。 原型很简单,功能跟atexit()差不多,只不过一个是线程一个是进程。 用来设置在push/pop内线程退出时要做的事情。

nosmatch的专栏 3422

手把手教你用Python实现双三次插值(附OpenCV对比测试)

本文深入解析了双三次插值算法的数学原理,并提供了从零开始的Python实现教程。通过与OpenCV官方实现的对比测试,详细评估了不同插值算法(包括最邻近差值、双线性插值)在图像质量与计算性能上的差异,帮助开发者掌握高质量图像缩放的核心技术。

weixin_29310605的博客 296

pthread_cleanup_push()

线程终止时的清理 不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解决的问题。 最经常出现的情形是资源独占锁的使用:线程为了访问临界资源而为其加上锁,但在访问过程中被外界取消,如果线程处于响应取消状态,且采用异步方式响应,或者在打开独占锁以前的运行路径上存在取消

木易云清 1116

材料力学小白必看:纯弯曲正应力计算全解析(附实例演示)

本文详细解析了材料力学中纯弯曲正应力的计算原理与工程应用,通过实例演示帮助初学者掌握关键公式和计算流程。内容涵盖纯弯曲的基本假设、正应力分布规律、截面特性计算,以及现代工具如Excel、ANSYS和Python在应力分析中的应用,特别适合材料力学小白系统学习。

sea99的博客 1232

HMC7044调试指南与FPGA开发

最后,我们介绍了在FPGA开发中使用HMC7044的几个常见应用场景,包括时钟分配、时钟同步、高精度时钟生成和时钟域交叉。根据您的应用需求,您可以选择不同的时钟分配方案,例如使用PLL生成特定频率的时钟信号,或者通过分频器生成较低频率的时钟信号。HMC7044可以提供精确的时钟同步功能,确保各个FPGA板之间的时钟信号保持一致,从而实现可靠的数据传输和协同操作。HMC7044可以实现时钟域之间的交叉,通过生成和分配不同频率的时钟信号,使得不同时钟域的模块能够协同工作。FPGA开发中的HMC7044应用。

CqpFsharp的博客 3619

线程清理(pthread_cleanup_push函数和pthread_cleanup_pop函数)

看了一会儿,没看懂这个,绝了。书上写的颠三倒四。文档给每个函数两句话。也是没看懂啊!

zy010101博客 2301

Megatron-LM中的TP、PP、DP、SP、CP并行

SP主要优化的是激活内存,它沿序列维度切分部分激活,适用于较短序列并行。CP主要解决的是长序列的显存问题,它沿序列维度切分所有激活和输入,并且对注意力机制也进行并行处理。二者可以组合使用,特别是当 TP > 1 并且需要处理长序列时,通过启用 SP 和 CP 可以最大化地优化内存使用和加速计算。

u013250861的博客 861

ZT 线程处理函数pthread_cleanup_push / pthread_cleanup_pop

http://bbs.youkuaiyun.com/topics/390688105 2)创建了线程,但是线程退出时没有线程调用pthread_join() 线程资源没有回收,如果持续创建线程,到一定数量后将不能再创建! 可以在创建的线程中使用pthread_detach(pthread_self()),主线程就可以不调用pthread_join() 1)只有pthread_cleanup_pu...

weixin_30379973的博客 164

VC中sqlite的使用

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

嵌入式Linux:注册线程清理处理函数

在 Linux 多线程编程中,线程终止时可以执行特定的清理操作,通过注册线程清理函数(thread cleanup handler)来实现。这类似于使用 atexit() 注册进程终止处理函数。线程清理函数用于在线程退出时执行一些资源释放或清理工作,例如关闭文件描述符、释放内存等。

不脱发的程序猿 499

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

多线程编程3

线程清理处理函数: void pthread_cleanup_push(void (*rtn)(void *), void *arg ); 设置清理函数 void pthread_cleanup_pop(int execute); execute为0,清理函数将不被调用;不为0则调用 清理函数运行的三种情况: 1,调用pthread_exit时 2,响应取消请求时 3,用非0 execute参数调

溪孟羽的专栏 438

线程的终止

线程终止 进程的终止: 1.进程中的任意线程调用了exit、_Exit 或者 _exit,那么整个进程就会终止。 2.如果默认的动作是终止进程,那么发送到线程的信号也会终止整个进程。 线程的终止: 在不终止进程的情况下停止单个线程: 1.线程可以从启动例程中返回(return),返回值是线程的退出码。 2.线程可以被同一进程中的其他线程取消。 3.线程调用pthread_e...

二月红 447

linux线程退出清理函数(详解)

和进程退出函数一样,线程也可以注册它退出时要调用的函数,这样的函数称为线程清理处理程序。处理程序在栈中,故它们的执行顺序与它们注册时的顺序相反。线程可以建议多个清理处理程序。3.用非零execute调用。2.响应其它线程的取消请求。调用注册的清理处理函数。

2403_83472896的博客 767

线程处理函数pthread_cleanup_push / pthread_cleanup_pop

线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。    pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:    1)调用pthread_exit。    2)作为对取消线程请求(pthread

9472

程处理函数pthread_cleanup_push / pthread_cleanup_pop

线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。    pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:    1)调用pthread_exit。    2)作为对取消线程请求(pthr

chlele0105的专栏 8671

APUE编程:55---线程处理(线程退出清理函数:pthread_cleanup_push、pthread_cleanup_pop)

一、注册清理函数:pthread_cleanup_push #include <pthread.h> void pthread_cleanup_push(void (*rtn)(void *), void *arg); 功能:向栈中注册一个线程退出清理函数 参数: rtn:注册函数的函数指针 arg:注册函数所使用的参数 因为处理程序记录在栈中,所以先注册的pthr...

董哥的黑板报 1134

linux线程——pthread_cleanup_push(),pthread_cleanup_pop()

线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序,线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说它们的执行顺序与它们注册时的顺序相反。 一、pthread_cleanup_push 函数简介:         头文件:#include         函数定义:void pthread_cleanup_push(void (*rtn)(void*),v

709

Linux pthread_exit及线程清理函数

pthread_exit 关于线程的终止 单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。 (1)线程只是从例程中返回,返回线程的退出码。 (2)线程可以被同一进程中的其他线程取消。 (3)线程调用pthread_exit。 头文件 #include 函数原型 void pthread_exit(void *retval);

cslqm 8314

针对初学者:pthread_cleanup_push()/pthread_cleanup_pop()讲解

针对初学者:pthread_cleanup_push()/pthread_cleanup_pop()讲解 函数原型 void pthread_cleanup_push(void (*routine) (void *), void *arg) void pthread_cleanup_pop(int execute) 问题引入 线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread...

weixin_44272193的博客 773

Linux线程(五)分离线程与注册线程清理函数详解

从打印结果可知,调用 pthread_cleanup_pop(1)执行了最后一次注册的清理函数,调用 pthread_exit()退出线程时执行了 2 次清理函数,因为前面调用 pthread_cleanup_pop()已经将顶层的清理函数移除栈中了,自然在退出时就不会再执行了。与进程不同,一个线程可以注册多个清理函数,这些清理函数记录在栈中,每个线程都可以拥有一个清理函数栈,栈是一种先进后出的数据结构,也就是说它们的执行顺序与注册(添加)顺序相反,当执行完所有清理函数后,线程终止。失败将返回一个错误码。

Dola的博客 1567

Linux线程(4)——pthread_detach()自动回收线程资源

从打印结果可知,调用 pthread_cleanup_pop(1)执行了最后一次注册的清理函数,调用 pthread_exit()退出线程时执行了 2 次清理函数,因为前面调用 pthread_cleanup_pop()已经将顶层的清理函数移除栈中了,自然在退出时就不会再执行了。与进程不同,一个线程可以注册多个清理函数,这些清理函数记录在栈中,每个线程都可以拥有一个清理函数栈,栈是一种先进后出的数据结构,也就是说它们的执行顺序与注册(添加)顺序相反,当执行完所有清理函数后,线程终止。失败将返回一个错误码。

cj_lsk的博客 5737
上一篇: 线程池
下一篇: epoll原理
labrary
博客等级 码龄15年 8粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值