注册线程清理函数|学习笔记

简介: 快速学习注册线程清理函数

开发者学堂课程【物联网开发- 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 ,必须成对出现,否则编译则出现错误。

相关文章
|
6天前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
45 0
|
6天前
|
存储 安全 数据管理
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
Linux系统编程教程之Linux线程函数的使用:讲解Linux线程函数
21 1
|
6天前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
19 4
多线程学习笔记(一)
创建线程有3种方式:继承Thread类、实现Runnable接口或Callable接口。继承Thread类时,重写run()方法并调用start()启动线程。实现Runnable接口时,实现run()方法,通过Thread的target创建线程对象并用start()启动。
|
6天前
|
Java C++
多线程学习笔记(二)
1. 子线程先执行:启动子线程后立即调用`join()`,主线程会等待子线程完成。 `suspend()`方法。 3. `synchronized` vs `Lock`:前者是关键字,后者是接口;前者可用在代码块和方法,后者在代码中显式;前者自动释放锁,后者需`finally`释放;前者无超时/中断控制,后者可设定;前者非公平,后者可公平/不公平,且支持读写锁。 4. `synchronized`底层实现:基于 Monitor 模型,JVM层面的锁定机制,通过 monitors 和 monitorenter/monitorexit 指令实现。
|
6天前
|
设计模式 安全 C++
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
243 2
|
6天前
|
存储 安全 Linux
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
55 0
【C/C++ 可重入函数与不可重入函数】理解C/C++ 中函数的可重入性以及与线程安全性的关系
|
3天前
|
Python
|
6天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
17 1
|
2天前
|
NoSQL Redis 缓存
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
【5月更文挑战第17天】Redis常被称为单线程,但实际上其在处理命令时采用单线程,但在6.0后IO变为多线程。持久化和数据同步等任务由额外线程处理,因此严格来说Redis是多线程的。面试时需理解Redis的IO模型,如epoll和Reactor模式,以及其内存操作带来的高性能。Redis使用epoll进行高效文件描述符管理,实现高性能的网络IO。在讨论Redis与Memcached的线程模型差异时,应强调Redis的单线程模型如何通过内存操作和高效IO实现高性能。
28 7
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?