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. HDU1269迷宫城堡(裸Tarjan有向图求强连通分量个数)

    迷宫城堡Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  2. cf1088C Ehab and a 2-operation task (构造)

    题意:给一个数列,你可以进行至多n+1次操作,每次给一个前缀对某数取模或者加某数,使得最后数列严格单增 考虑到因为是前缀和而且还不能加负数,光靠加是不能让前面的小于后面的 所以要让他先在模某数意义下单 ...

  3. 关于angular1与angular2的应用区别

    angular1.0的这些繁杂的api,还有它的执行速度,运行效率,学习曲线,都被人吐槽,最近一直在用ng1,实在很想吐槽. 最近写ng2的项目,写了一些ng2基础的应用(包括angular-cli, ...

  4. 洛谷P2178 品酒大会

    题意:若两个字符开始的后面r个字符都一样,则称这两个字符是r相似的.它们也是r-1相似的. 对于r∈[0,n)分别求有多少种方案,其中权值最大方案权值是多少.此处权值是选出的两个字符的权值之积. 解: ...

  5. P1972 HHのnecklace 离线+树状数组

    此题莫队可过 然而太难了...... 我在胡雨菲那看的解法,然后自己打了一波,调了一个错,上交,自信AC. 做法:离线,对于L排序. 每种颜色可能出现很多次,那么我们如何不算重复呢? 只需把[L,n] ...

  6. Windows android SDK环境配置及判断安装成功

  7. R语言修改标题、坐标轴刻度、坐标轴名称的大小(cex.axis、cex.lab、cex.main函数)

    修改标题.坐标轴刻度.坐标轴名称的大小,用到了cex.axis.cex.lab.cex.main函数,其中,cex.axis表示修改坐标轴刻度字体大小,cex.lab表示修改坐标轴名称字体大小,cex ...

  8. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  9. springmvc跨域上传文件问题

    把以下文件放到webapps的root文件夹下: 1.clientaccesspolicy.xml <?xml version="1.0" encoding="ut ...

  10. SCU-4437 Carries

    https://blog.csdn.net/catglory/article/details/46539283 https://blog.csdn.net/u012127882/article/det ...