开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:注册线程清理函数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11066
注册线程清理函数
内容介绍
一、线程清理处理程序的定义
二、注册清理函数
三、弹出清理函数
四、执行清理函数的情况
一、线程清理处理程序的定义
和进程的退出清理一样,线程也可以注册它退出时要调用的函数,这样的函数称为线程清理处理程序(thread cleanup handler)。
注意:
线程可以建立多个清理处理程序。
处理程序在栈中,故它们的执行程序与它们注册的顺序相反。
二、注册清理函数
#include<pthrread.h>
void pthread_cleanup_push(void (*routine)(void*), void*arg);
//pthread_cleanup_push 注册清理函数
//void (*routine)(void*) 清理函数入口,传入函数地址,线程结束时执行清理函数
//arg 传给线程清理函数的参数
//routine 线程清理函数的指针
功能:将清理函数压栈。即注册清理函数。
注意:清理函数必须返回置为空。
三、弹出清理函数
#include<pthrread.h>
void pthread_cleanup_pop(int execute);
//pthread_cleanup_pop 弹出清理函数
//execute 线程清理函数执行标志位。
非0,弹出清理函数,执行清理函数。
0,弹出清理函数,不执行清理函数。
若调用该函数,则说明线程未结束。若线程结束,则清理函数按顺序进行。
四、执行清理函数的情况
当线程执行以下动作时会调用清理函数:
1、调用 pthread_exit 退出线程。
2、响应其它线程的取消请求。
3、用非零 execute 调用 pthread_cleanup_pop。
无论哪种情况 pthread_cleanup_pop 都将删除上一次 pthread_cleanup_push 调用注册的清理处理函数。
写代码时,写入一个 push ,就必须带有一个 pop ,必须成对出现,否则编译则出现错误。