POSIX 线程清理函数

控制清理函数的函数有两个,一个是 pthread_cleanup_push(), 用来把清理函数压入栈中,另一个是 pthread_cleanup_pop(), 用来把栈中的函数弹出来。

用这两个函数组合,可以达到在线程退出时,清理线程数据的作用, 例如对 mutex 进行解锁等。

下面是这两个函数的函数原型:

我们先写个简单的例子,感性认识一下这两个函数的作用:

编译并运行:

我们在代码里面是按照 one、two、thr 的顺序调用的 pthread_cleanup_push() 函数, 结果在运行后得到的结果中,却看到它们输出的顺序正好倒过来了。 这正是这对函数的性质。

并且这对函数还有一个性质,那就是使用 pthread_cleanup_push() 和 pthread_cleanup_pop() 之间使用 return 的话,会导致之后的 pthread_cleanup_pop() 不起作用。 这是为什么呢?原因是,其实 pthread_cleanup_push() 和 pthread_cleanup_pop() 不是函数, 而是一对宏。

其宏定义在头文件 pthread.h 中可以看到,宏定义如下:

我们写个更简单的程序,把这两个宏展开后看一看是什么样结果:

代码如下:

编译:

查看 pthread_cleanup_macro.i 的代码:

可以看到,thread_start 函数里面的 pthread_cleanup_push() 和 pthread_cleanup_pop() 已经被展开了。我们把 thread_start 函数里面的代码再修饰一下格式,结果如下:

可以看到,我们输出线程信息的 printf 语句,被一层层的 do{}while(0) 给包围了。 如果在 pthread_cleanup_push() 和 pthread_cleanup_pop() 之间加一个 return , 那么整个 do{}while(0) 就会被跳出,后面的代码肯定也就不会被执行了。

Original: https://www.cnblogs.com/fengbohello/p/7571730.html
Author: fengbohello
Title: POSIX 线程清理函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/540157/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 就从这里开始吧

    之前有人论断说,今后工程师不再是一种职业,而是一种生存所必须掌握的技能,就像驾照一样。也就是说,在未来,不管是卖吃的,卖穿的,卖玩的,还是搞文化活动的,都免不了需要做点开发工作,而…

    Java 2023年6月7日
    095
  • REST

    社会在发展,时代在进步。人们日常使用的电子产品也从个人电脑发展到平板电脑,智能手机,智能手表,智慧屏,等等。这些电子产品装有各种各样的系统,各种各样的系统装有各种各样的软件,各种各…

    Java 2023年6月5日
    092
  • AC自动机:Tire树+KMP

    简介 AC自动机是一个多模式匹配算法,在模式匹配领域被广泛应用,举一个经典的例子,违禁词查找并替换为***。AC自动机其实是Trie树和KMP 算法的结合,首先将多模式串建立一个T…

    Java 2023年6月9日
    089
  • iOS之Core Data及其线程安全

    一、简介 Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库…

    Java 2023年5月29日
    072
  • Nginx 源码分析– ngx_string 的一些简单分析

    对于一个web服务器程序来说,对字符串处理的需求是必须的。由于web环境下的各种编码,也导致了web服务器程序字符串处理的繁杂性。在nginx源码中,ngx_string.c这个文…

    Java 2023年6月15日
    095
  • Apache Druid 数据摄取—本地数据和kafka流式数据

    Durid概述 Apache Druid是一个集时间序列数据库、数据仓库和全文检索系统特点于一体的分析性数据平台。本文将带你简单了解Druid的特性,使用场景,技术特点和架构。这将…

    Java 2023年6月15日
    088
  • wwdc2016-session707 Notifications(draft)

    通知这哥们说话有点不清晰啊。 远程通知本地通知 可以被操作的通知Dismiss Notifications 左滑消除UNNotification 响应式的通知 只有一个方法UNUs…

    Java 2023年5月30日
    098
  • 理解IOC

    学习Spring,IOC是个绕不过去的话题。作为Spring的基础,IOC有太多博客和教程了。这里做个简单的梳理,以找工作为例,谈谈我对IOC的理解。 在经典的MVC架构这,一般会…

    Java 2023年6月5日
    0102
  • 再也不用担心重装VSCode了

    1. 关于Settings Sync插件 Setings Sync插件可以同步你的VSCode配置到 Github Gist,当你更换电脑重新搭建VSCode环境的时候,直接使用该…

    Java 2023年6月7日
    078
  • 同步IO, 异步IO的理解

    什么是IO? 在计算机中无时无刻不存在着对数据的访问和读取(数据都存储在物理的媒介上,例如寄存器,高速缓存,内存,磁盘,网卡等等),这些操作被称为IO。 阻塞IO 当用户线程发起I…

    Java 2023年6月6日
    0106
  • Golang中的redblacktree

    一、红黑树 1.红黑树是一种自平衡的二叉搜索树,也是一种高效的查找树。红黑树的应用很广泛,如Java中的TreeMap、JDK1.8中的HashMap等均是基于红黑树实现的。 二、…

    Java 2023年6月13日
    077
  • 再谈Mysql undo log, redo log与binlog

    一、undo log 1、undo log有两个作用 提供回滚和多个行版本控制(MVCC)。 在数据修改的时候,不仅记录了redo log,还记录了对应的undo,如果因为某些原因…

    Java 2023年6月5日
    080
  • Skywalking-13:Skywalking模块加载机制

    模块加载机制 基本概述 Module 是 Skywalking 在 OAP 提供的一种管理功能特性的机制。通过 Module 机制,可以方便的定义模块,并且可以提供多种实现,在配置…

    Java 2023年6月5日
    094
  • 排序总结 O_o

    常见的排序算法对比:时间复杂度上:插入类没有,选择类的 堆排、交换类的 快排、独一档:归并稳定性:归并排序独一档,又快又稳定,剩下的都是慢的(直接插入、冒泡) 参考文章 插入类 【…

    Java 2023年6月7日
    0114
  • 国际化异常:No message found under code ‘xxx’ for locale ‘zh_CN’ 解决办法

    导致该异常可能的原因: 没有配置 LocaleChangeInterceptor 拦截器。 基于 session 获取用户语言设定决定语言区域,必须配置拦截器。 Spring MV…

    Java 2023年6月13日
    075
  • 针对Asp.net MVC SEO的几点建议

    1. 引言 SEO 即搜索引擎优化,很多web开发人员本应该熟悉,至少需要了解的一个知识点。像百度、必应等搜索引擎其实一直都在进化。但是有些优化的技巧可能在短时间内不变。 今天就给…

    Java 2023年6月5日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球