IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> tlpi:线程取消(pthread_cancel...) -> 正文阅读

[移动开发]tlpi:线程取消(pthread_cancel...)

线程取消

  • pthread_cancel

    #include<pthread.h>
    int pthread_cancel(pthread_t thread);
    						//成功:返回0    失败:返回正数
    

    函数pthread_cancel()可以向由thread指定的线程发送一个取消请求

    发送取消请求后,函数pthread_cancel()当立即返回,不会等待目标线程的退出

取消的状态和类型

当执行取消操作,即pthread_cancel时,取消的结果取决于取消的状态和类型,可以通过下面的函数进行设置

#include<pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
																	//成功:返回0  失败:返回正数

函数pthread_setcancelstate会将调用线程的取消性状态设置为参数state所指定的状态,pthread_setcanceltype也是一样,state状态有如下两种

  • PTHREAD_CANCEL_DISABLE

    线程不可取消,如果此类线程收到取消请求,那么会将请求挂起,直到将线程的取消状态置为启用

  • PTHREAD_CANCEL_ENABLE

    线程可以取消,这是新建线程取消状态的默认值

如果线程的取消状态为ENABLE,那么取消操作将会取决于取消的类型,有以下两种

  • PTHREAD_CANCEL_ASYCHRONOUS

    可以在任何时点进行取消,但是不常用

  • PTHREAD_CANCEL_DEFERED

    取消请求将保持挂起状态,直到程序运行到取消点,这也是新建线程的默认类型

参数oldstate/oldtype保存了上一次的状态或者类型

取消点

SUSv3规定,如果实现提供有下列函数,那么这些函数必须是取消点,即如果之前有取消请求,那么线程运行到此时必须终止
在这里插入图片描述
程序一旦收到取消请求,且启用了取消状态并将类型置为延迟,那么其会在下一次抵达取消点时终止,这种操作又被称为延迟取消

如果线程取消时未分离,那么为了防止其变成僵尸进程,必须手动对其进行连接,连接之后,返回给pthread_join()的第二个参数为

PTHREAD_CANCELED

可取消性的检测

  • pthread_testcancel

    使用pthread_testcancel()可以产生一个取消点,如果线程已经有处于挂起状态的取消请求,那么他就会立即返回,线程随之终止

    #include<pthread.h>
    void pthread_testcancel(void);
    

清理函数

有时希望在线程结束之前做一些处理工作,如解锁或者清理空间等,此时就需要用到清理函数

每个线程都可以拥有一个清理函数栈,但线程遭到取消时,会沿着该栈自顶向下一次执行清理函数

#include<pthread.h>
void pthread_cleanup_push(void (routine)(void *), void *arg);
void pthread_join_pop(int execute);

顾名思义,pthread_clean_push()可将routine清理函数加入到清理函数栈中,pop()即将栈顶元素弹出

参数解释

arg是作为routine的参数传入

如果execute是非0值,那么执行pthread_join_pop()时就一定会触发栈顶的清理函数,如果为0,也有可能会执行栈顶函数

异步取消

若取消类型为PTHREAD_CANCEL_ASYNCHRONOUS,则为异步取消, 既可以在任何时点进行取消,这势必会造成混乱,尽量少用

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 12:52:17  更:2021-11-17 12:52:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:25:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码