线程处理函数pthread_cleanup_push / pthread_cleanup_pop_使用 pthread_cleanup_push()和 pthread_cleanup_pop() 进-程序员宅基地

技术标签: LinuxC  

             线程处理函数pthread_cleanup_push / pthread_cleanup_pop

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

    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传递给处理函数的参数

返回值:



 

[cpp]  view plain  copy
  1. #include <stdio.h>    
  2. #include <stdlib.h>    
  3. #include <pthread.h>    
  4. #include <string.h>    
  5.    
  6. void cleanup(void *arg){    
  7.     printf("cleanup: %s/n",(char *)arg);    
  8. }    
  9.    
  10. void *thr_fn1(void *arg){    
  11.     printf("thread 1 start/n");    
  12.     pthread_cleanup_push(cleanup,"thread 1 first handler");    
  13.     pthread_cleanup_push(cleanup,"thread 1 second handler");    
  14.     printf("thread 1 push complete/n");    
  15.     if(arg)    
  16.         return ((void *)1);    
  17.     pthread_cleanup_pop(1);    
  18.     pthread_cleanup_pop(1);    
  19.     return ((void *)1);    
  20. }    
  21.    
  22. void *thr_fn2(void *arg){    
  23.     printf("thread 2 start/n");    
  24.     pthread_cleanup_push(cleanup,"thread 2 first handler");    
  25.     pthread_cleanup_push(cleanup,"thread 2 second handler");    
  26.     printf("thread 2 push complete/n");    
  27.     if(arg){    
  28.         pthread_exit((void *)2);    
  29.     }    
  30.     pthread_cleanup_pop(0);  //取消第一个线程处理程序  
  31.   
  32.     pthread_cleanup_pop(0);  //取消第二个线程处理程序  
  33.    
  34.     pthread_exit((void *) 2);    
  35. }    
  36.    
  37. int main(void){    
  38.     int err;    
  39.     pthread_t tid1,tid2;    
  40.     void *tret;    
  41.    
  42.     err = pthread_create(&tid1,NULL,thr_fn1,(void *)1);    
  43.     if( err != 0){    
  44.         fprintf(stderr,"create thread1 failed: %s",strerror(err));    
  45.         exit(1);    
  46.     }    
  47.    
  48.     err = pthread_create(&tid2,NULL,thr_fn2,(void *)2);    
  49.     if(err != 0){    
  50.         fprintf(stderr,"create thread 2 failed: %s",strerror(err));    
  51.         exit(1);    
  52.     }    
  53.    
  54.     err = pthread_join(tid1,&tret);    
  55.     if(err != 0){    
  56.         fprintf(stderr,"thread1 join failed: %s",strerror(err));    
  57.         exit(1);    
  58.     }    
  59.     printf("thread 1 exit code %d/n",(int)tret);    
  60.     err = pthread_join(tid2,&tret);    
  61.     if(err != 0){    
  62.         fprintf(stderr,"thread2 join failed: %s",strerror(err));    
  63.         exit(1);    
  64.     }    
  65.     printf("thread 2 exit code %d/n",(int) tret);    
  66.     exit(0);     
  67. }   

补充一下: phtread_cleanup_push 与 phread_cleanup_pop要成对儿的出现,否则会报错!!


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fly_sky_share/article/details/79048054

智能推荐

Cookie 从入门到进阶:一文彻底弄懂其原理以及应用_cookies.set(tokenkey, token)是异步吗-程序员宅基地

文章浏览阅读1.5k次。一、Cookie 是什么?Cookie,它的名字源自一种叫 Fortune cookie 的饼干,这种饼干里面有一张写着精辟句子的小纸条。在浏览器中,Cookie 是服务器让浏览器帮忙携带信息的手段,就像饼干里的纸条,浏览器会储存它,并且在后续的 HTTP 请求中再次发送给服务器。二、Cookie 应用主要用于以下三个方面:会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)个性化设置(如用户自定义设置、主题等)浏览器行为跟踪(如跟踪分析用户行为等)因为 HTTP _cookies.set(tokenkey, token)是异步吗

Elasticsearch自定义算法-FunctionScoreQueryBuilder-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏14次。GET /user_info/_search{ "explain": true, "query": { "function_score": { "query": { "bool": { "should": [ {"range": {"age": {"gte": 18,"lte": 38}}}, {"range": {"height": {"gte": 160,"lte": 175}}}, _functionscorequerybuilder

Choco安装npm_choco npm-程序员宅基地

文章浏览阅读1.1w次。安装依赖1.安装Chocolateyhttps://chocolatey.org/install依次执行命令Get-ExecutionPolicySet-ExecutionPolicy Bypass -Scope ProcessSet-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePoint_choco npm

java数据库连接池代码实现_java写个跟连接池一样的逻辑代码-程序员宅基地

文章浏览阅读1.9k次。连接池原理已经解释了,下面该看看代码是如何实现的吧 数据库连接池有很多,我就不一一列举了,有 dbcp,c3p0, Proxool,BoneCP,Druid............强迫症可以自己去百度,然后背下来简单介绍一下,DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使_java写个跟连接池一样的逻辑代码

Linux声音解决方案与TTS引擎_ekho 发声不清楚-程序员宅基地

文章浏览阅读7.3k次。一、ALSA+Pulseaudio在嵌入式Linux中的声音解决方案Linux音频系统比较复杂,各层间有很多交叉,可能是最无序的子系统,并且它有两套音频驱动框架: OSS (Open Sound System)和ALSA (Advanced Linux Sound Architechture),所以底层驱动有OSS和ALSA两套API。 ALSA经过多年的发展,基本统一了Linux声卡..._ekho 发声不清楚

关于c++函数 lower_bound & upper_bound_c++ lower_bound reference-程序员宅基地

文章浏览阅读350次。关于c++ STL函数 lower_bound & upper_bound前言正文a. 介绍b. 作用c. 意义d. 举例e. 源码前言在刷leetcode的时候看到有用lower_bound(),对这个函数印象只有一点点。到网上去查lower_bound() & upper_bound(),很多解释都是,lower_bound()返回第一个>=value的值,upper_bound()返回第一个>value的值。这种结果为导向的答案,虽然能分清两个函数了,但作用还不太理_c++ lower_bound reference

随便推点

CVX工具箱使用1_cvx max min-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏7次。利用CVX求解max-min问题:其中的辅助变量z=min{f(x)}一定是用二分搜索或者是用上一次处的迭代值获得的,注意:**它不可能是带variable x(n)**的,否则这个问题还是无法解的。注意使用过程中的一些规则及注意点:1.表达规范与问题是否真的是凸问题当然了:最好是写约束条件的时候,每多添加一项就运行一下,至少会报错告诉你“这是一个凸/凸不可解”或者“这是一个凸+复的仿射集不可解”等等,慢慢纠错检查总没错的。2.发现这玩意儿,运行起来太慢了,能不用就不用,看见要用CVX我就害怕_cvx max min

东方博宜OJ题解_1109: 【入门】加密四位数-程序员宅基地

文章浏览阅读2.6w次,点赞7次,收藏45次。东方博宜OJ题解(主要是按题单的顺序来写的),请大家多多支持_1109: 【入门】加密四位数

word方框里打勾_如何在方框里打勾 word-程序员宅基地

文章浏览阅读2.2k次。直接在Word中输入数字「2611」,然后使用快捷键「ALT + X」即可快速输入一个方框中打钩付款「2612」按下「ALT + X」就是叉了_如何在方框里打勾 word

python - matplotlib.legend()函数用法解析_python legend函数-程序员宅基地

文章浏览阅读10w+次,点赞78次,收藏507次。1.图例legend基础语法及用法 legend语法参数如下: matplotlib.pyplot.legend(*args, **kwargs) Keyword Description loc Location code string, or tuple (see below).图例所有figure位置 ..._python legend函数

跨平台flutter- window与Android Studio环境配置_android toolchain - develop for android devices x -程序员宅基地

文章浏览阅读2.9k次,点赞8次,收藏20次。躬耕8年iOS 前京南互联网大厂研发-大民哥带你认识跨平台flutter在window与android Studio环境配置,windows下android Studio玩转flutter这一篇文章就够了,如有疑问欢迎留言讨论_android toolchain - develop for android devices x android_home = g:\android_

不同类型吉比特收发器的对比(GTP、GTX、GTH、GTZ与GTY)_gtx gtp gth-程序员宅基地

文章浏览阅读8.4k次,点赞12次,收藏66次。1 性能首先,DS180中有关于7系列资源对比的表格:可以看到不同系列收发器个数和传输速度都不一样。Artix-7 中的收发器类型为GTPKintex-7 中的收发器类型为GTX(GTXE2)Virtex-7 中的收发器类型为GTX/GTH/GTZ (GTXE2/GTHE2/GTZE2)UltraScale 中的GTHE3、GTYE3UltraScale+ 中的GTHE4、GTYE4关于7系列FPGA各型器件高速收发器的性能,在XMP101:7系列器件选型文档中有:7系列高性能低功耗_gtx gtp gth

推荐文章

热门文章

相关标签