37.1 线程清理和控制函数

 #include <pthread.h>

 void pthread_cleanup_push(void (* rtn)(void *), void *arg);
void pthread_cleanup_pop(int execute);
  • 函数参数

    • rtn:清理函数指针
    • arg:调用清理函数传递的参数
    • execute:值 1 时,执行线程清理函数;值 0 时,不执行线程清理函数
  • 返回值
    • 成功,返回 0;否则,返回错误编号
  • 触发线程调用清理函数的工作
    • 调用 pthread_exit
    • 响应取消请求
    • 用非零 execute 参数调用 thread_cleanup_pop 时
 #include <stdio.h>
#include <stdlib.h>
#include <pthread.h> /** 定义线程清理函数 */
void clean_fun(void *arg)
{
char *s = (char *)arg;
printf("clean_fun: %s\n", s);
} void *th_fun(void *arg)
{
int execute = (int )arg; pthread_cleanup_push(clean_fun, "first clean func");
pthread_cleanup_push(clean_fun, "second clean func");
printf("thread running %lx\n", pthread_self()); pthread_cleanup_pop(execute);
pthread_cleanup_pop(execute);
return (void *);
} int main(void)
{
int err;
pthread_t th1, th2; if((err = pthread_create(&th1, NULL, th_fun, (void *))) != ) {
perror("pthread create error");
} pthread_join(th1, NULL);
printf("th1(%lx) finished\n", th1); if((err = pthread_create(&th2, NULL, th_fun, (void *))) != ) {
perror("pthread create error");
} pthread_join(th2, NULL);
printf("th2(%lx) finished\n", th2); return ;
}

  运行如下:

  

  线程结束,会触发调用最终的 clean 函数,调用的时候会根据 pop 里面的入栈顺序,先入后出进行调用。

37.2 进程和线程启动方式比较

  

37.3 线程的状态转换

  

三十七、Linux 线程——线程清理和控制函数、进程和线程启动方式比较、线程的状态转换的更多相关文章

  1. Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信

    1.Java使用Thread类代表线程.     所有的线程对象必须是Thread类或其子类的实例. 当线程继承Thread类时,直接使用this即可获取当前线程,Thread对象的getName() ...

  2. 11.python之线程,协程,进程,

    一,进程与线程 1.什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行 ...

  3. “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. 菜鸡的Java笔记 第三十七 - java 线程与进程

    线程与进程        线程与进程的区别                最早的的时候DOS 系统有一个特点:只要电脑有病毒,那么电脑就死机了,是因为传统的DOS 系统属于单进程的操作系统       ...

  5. Java并发编程原理与实战三十七:线程池的原理与使用

    一.简介 线程池在我们的高并发环境下,实际应用是非常多的!!适用频率非常高! 有过使用过Executors框架的朋友,可能不太知道底层的实现,这里就是讲Executors是由ThreadPoolExe ...

  6. 第三十七章 POSIX线程(一)

    POSIX线程库相关介绍   与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都有"pthread_"开头   要使用这些函数库,都需要加入头文件"<pth ...

  7. VC启动一个新线程的三种方法

    第一种AfxBeginThread() 用AfxBeginThread()函数来创建一个新线程来执行任务,工作者线程的AfxBeginThread的原型如下: CWinThread* AfxBegin ...

  8. Linux常用三十七条指令

    Linux常用三十七条指令 基础指令(11):ls,pwd,cd,mkdir,touch,cp.mv,rm,vim,>/>>/,cat 进阶指令(10):df,free,head,t ...

  9. [转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

    Linux系统进程的知识总结,进程与线程之间的纠葛... https://cloud.tencent.com/developer/article/1500509 当一个程序开始执行后,在开始执行到执行 ...

随机推荐

  1. 【php】php算法的一些实现

    1.生成一定范围内的数组,步长可以设置 function range($step = 10, $max = 100){ if ($step < 1 || $step > $max){ re ...

  2. Zabbix3.4监控平台部署

    环境依赖 CentOS 7.3 + PHP5.4 + MariaDB + Nginx Zabbix Server 3.4.1 环境要求 12 CPU ,最少8 CPU 32G 内存,最少16G 1T ...

  3. 小白眼中的AI之~Numpy基础

      周末码一文,明天见矩阵- 其实Numpy之类的单讲特别没意思,但不稍微说下后面说实际应用又不行,所以大家就练练手吧 代码裤子: https://github.com/lotapp/BaseCode ...

  4. 使用python简单连接并操作数据库

    python中连接并操作数据库 图示操作流程 一.使用的完整流程 # 1. 导入模块 from pymysql import connect # 2. 创建和数据库服务器的连接,自行设置 服务器地址, ...

  5. 区间最深LCA

    求编号在区间[l, r]之间的两两lca的深度最大值. 例题. 解:口胡几种做法.前两种基于莫队,第三种是启发式合并 + 扫描线,第四种是lct + 线段树. ①: 有个结论就是这个答案一定是点集中D ...

  6. 初识JSP知识

    一.jsp概述 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP实际上就是Servlet. jsp = html ...

  7. _future_用法总结

    写这篇文章主要是参考以下两篇博客 https://blog.csdn.net/stan_pcf/article/details/60465665 https://www.liaoxuefeng.com ...

  8. 过滤富文本编辑器中的html元素和其他元素

    https://blog.csdn.net/fjssharpsword/article/details/53467079 1.应用场景:从一份html文件中或从String(是html内容)中提取纯文 ...

  9. STM32F4 ------ RTC

    如果只执行 HAL_RTC_GetTime(),读取完后时间不再跑 HAL_RTC_GetTime() 和 HAL_RTC_GetDate()

  10. oracle中的insert all into,在mysql中的写法

    oracle中的insert all into表示插入多条数据,mysql中可以采用: INSERT INTO表名(字段1,字段2..) values <foreach collection=& ...