首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >POSIX之cancel

POSIX之cancel

作者头像
Taishan3721
发布于 2022-12-05 07:55:36
发布于 2022-12-05 07:55:36
72100
代码可运行
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks
运行总次数:0
代码可运行

线程在创建后,除了调用pthread_exit()主动退出,还可以被其它线程/任务通过pthread_cancel()来退出,这种机制叫做cancellation

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 向<thread>发送一个cancellation请求.
 * 根据线程的不同设置,
 * 线程可能忽略这个请求,
 * 或立即终止,
 * 或推迟到下一个cancellation point再终止.
 *
 * 线程终止时, 执行的操作类似于pthread_exit(), 不过返回值为'PTHREAD_CANCELED'.
 */
int pthread_cancel
    (
    pthread_t thread
    );

新创建的线程,默认就支持cancellation。其状态可以使用pthread_setcancelstate()来修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 将线程的cancellation状态设置为<state>,
 * 如果<oldstate>非NULL, 返回之前的状态.
 *
 * 状态值二选一:
 *   PTHREAD_CANCEL_ENABLE
 *   PTHREAD_CANCEL_DISABLE
 *
 * 新线程的默认状态为PTHREAD_CANCEL_ENABLE
 */
int pthread_setcancelstate
    (
    int state,
    int *oldstate
    );

这个cancellation类型有两种,通过pthread_setcanceltype()设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 将线程的cancellation类型设置为<type>,
 * 如果<oldtype>非NULL, 返回之前的类型.
 *
 * 类型值二选一:
 *   PTHREAD_CANCEL_ASYNCHRONOUS - 立即执行收到的cancellation请求
 *   PTHREAD_CANCEL_DEFERRED - 下一个cancellation point再执行cancellation
 *
 * 新线程的默认类型为PTHREAD_CANCEL_DEFERRED
 */
int pthread_setcanceltype
    (
    int type,
    int *oldtype
    );

如何添加cancellation point呢?可以使用pthread_testcancel()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 为当前线程创建一个cancellation point.
 *
 * 如果已经enable cancellation,
 * 并且cancellation类型是PTHREAD_CANCEL_DEFERRED,
 * 并且已经收到cancellation请求,
 * 则调用pthread_exit()并返回'PTHREAD_CANCELED'.
 */
void pthread_testcancel();

那为什么第一个例子里的sleep()也可以cancel呢?是因为OS的一些API使用了一个pthread_testandset_canceltype()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 相当于先执行pthread_testcancel(), 再执行pthread_setcanceltype().
 */
int pthread_testandset_canceltype
    (
    int type,
    int *oldtype
    );

都有哪些呢

函数

aioPxLib

aio_suspend()

ioLib

creat(), open(), read(), write(), close(), fsync(), fdatasync()

mqPxLib

mq_receive(), mq_send()

pthreadLib

pthread_cond_timedwait(), pthread_cond_wait(), pthread_join(), pthread_testcancel()

semPxLib

sem_wait()

sigLib

pause(), sigsuspend(), sigtimedwait(), sigwait(), sigwaitinfo()

timerLib

sleep(), nanosleep()

cancellation这种行为,线程本身很难预测,因此线程使用的一些系统资源就无法按照正常退出的流程去释放。这种情况,可以使用pthread_cleanup_push()来注册一些清理函数。而在正常退出之前,可以使用pthread_cleanup_pop()将其取消

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * 添加cancellation清理函数<routine>.
 * 线程退出时, 按照添加顺序的倒叙、使用参数<arg>执行.
 */
void pthread_cleanup_push
    (
    void (*routine)(void *),
    void *arg 
    );
/*
 * 删除最后添加的清理函数.
 * 如果<run>非0, 则执行它.
 */
void pthread_cleanup_pop
    (
    int run
    );
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
线程源码分析之cancel.c(基于linuxthreads2.0.1)
cancel.c实现了线程的是否可取消,取消类型,取消线程,设置线程退出时需要执行的函数列表等功能。 /* Thread cancellation */ #include <errno.h> #include "pthread.h" #include "internals.h" #include "restart.h" /* 修改线程的可取消属性。有一个取消点 取消状态分为可取消,不可取消 不可取消的时候,收到取消信号,忽略 可取消的时候,收到取消信号的时候,根据取消类型做处理。
theanarkh
2019/10/08
4930
pthread_cancel函数
pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行,
心跳包
2020/08/31
1.7K0
嵌入式Linux:线程的创建、终止、回收、取消和分离
在多线程编程中,需要妥善管理线程的生命周期,以避免资源泄漏、竞争条件或僵尸线程等问题。
不脱发的程序猿
2025/01/02
5330
嵌入式Linux:线程的创建、终止、回收、取消和分离
多线程编程C语言版
什么是多线程,提出这个问题的时候,我还是很老实的拿出操作系统的书,按着上面的话敲下“为了减少进程切换和创建开销,提高执行效率和节省资源,我们引入了线程的概念,与进程相比较,线程是CPU调度的一个基本单位。”
DeROy
2021/11/16
3.8K0
多线程编程C语言版
linux多线程pthread
   早在LINUX2.2内核中。并不存在真正意义上的线程,当时Linux中常用的线程pthread实际上是通过进程来模拟的,也就是同过fork来创建“轻”进程,并且这种轻进程的线程也有个数的限制:最多只能有4096和此类线程同时运行。    2.4内核消除了个数上的限制,并且允许在系统运行中动态的调整进程数的上限,当时采用的是Linux Thread 线程库,它对应的线程模型是“一对一”,而线程的管理是在内核为的函数库中实现,这种线程得到了广泛的应用。但是它不与POSIX兼容。另外还有许多诸如信号处理,进程ID等方面的问题没有完全解决。    相似新的2.6内核中,进程调度通过重新的编写,删除了以前版本中的效率不高的算法,内核框架页也被重新编写。开始使用NPTL(Native POSIX Thread Library)线程库,这个线程库有以下几个目标: POSIX兼容,都处理结果和应用,底启动开销,低链接开销,与Linux Thread应用的二进制兼容,软硬件的可扩展能力,与C++集成等。 这一切是2.6的内核多线程机制更加完备。
阳光岛主
2019/02/19
5.2K0
Linux多线程编程小结
前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节。文章内容主要总结于《Linux程序设计第3版》。
全栈程序员站长
2022/07/12
1.7K0
Linux下精简线程池的实现
这个线程池是在学习完《Linux/UNIX系统编程手册》中线程相关知识后用来练手的小项目,线程相关函数都是直接调用Linux的API,并且使用了C++中的queue和vector。 虽然C++中也提供了线程创建、互斥锁等函数库,但是也是对系统函数的封装。并且作为初学,先学会用原生函数比较好。
yifei_
2022/11/14
2K0
Linux下精简线程池的实现
linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
本文介绍了多线程和线程同步的基础知识,并基于Linux环境进行了详细的实例分析。通过本文的学习,读者可以掌握多线程和线程同步的基本原理,并能够使用相关技术解决实际问题。
s1mba
2017/12/28
3.4K0
linux网络编程之posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
Linux系统编程-(pthread)线程创建与使用
前面文章介绍了Linux下进程的创建、管理、使用、通信,了解了多进程并发;这篇文章介绍Linux下线程的基本使用。
DS小龙哥
2022/02/17
3.1K0
Linux系统编程-(pthread)线程创建与使用
线程清理(pthread_cleanup_push函数和pthread_cleanup_pop函数)
看了一会儿,没看懂这个,绝了。书上写的颠三倒四。文档给每个函数两句话。也是没看懂啊!
zy010101
2020/05/09
4.4K0
线程清理(pthread_cleanup_push函数和pthread_cleanup_pop函数)
嵌入式Linux:注册线程清理处理函数
在 Linux 多线程编程中,线程终止时可以执行特定的清理操作,通过注册线程清理函数(thread cleanup handler)来实现。
不脱发的程序猿
2025/01/07
1390
嵌入式Linux:注册线程清理处理函数
一万个进程的鬼故事 --- 多线程系列(三)
大家好,我是天天被白嫖却越被白嫖越爽、秃顶法师老赵养猪的御用兽医、东北大膘客的灵魂伴侣、早就进化且早就开始享受的高等文明、欧阳狂霸的第二面孔---谢顶道人老李。
老李秀
2021/06/17
6140
一万个进程的鬼故事 --- 多线程系列(三)
pthread_create 线程属性-多线程操作 pthread_create pthread_join
  例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。
宜轩
2022/12/26
1.1K1
线程源码分析之join.c(基于linuxthreads2.0.1)
join.c文件一共有三个函数,下面我们一个个看一下。 1 pthread_exit // 线程退出 void pthread_exit(void * retval) { // 获取当前线程的结构
theanarkh
2019/10/08
1.1K0
【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解
https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482
GG Bond1
2025/02/19
2030
【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解
并发问题解密:探索多线程和锁机制
描述: pthread_create()函数在调用进程中启动一个新线程。新线程通过调用start_routine()开始执行;arg作为start_routine()的唯一参数传递。
Lion 莱恩呀
2024/09/26
3460
并发问题解密:探索多线程和锁机制
【Linux线程】线程控制原语详细介绍
线程就是 Light weight process ,LWP,轻量级进程,在Linux环境下它仍然是进程,一个进程内部可以有多个线程,默认情况下一个进程内部有一个线程。不同的是,进程有自己的进程控制块PCB,并且拥有自己独立的地址空间;而线程虽然也有线程控制块(这样来看,如果一个进程内有多个线程,那么进程内将有多个PCB),但是它没有独立的地址空间,而是共享空间,我们可以理解为在进程的虚拟空间中除了栈都是共享的(在实际编程中,线程一般就是一个函数,函数肯定要有自己的栈来运行)。也就是说,进程和线程最大的区别在于是否共享地址空间。在Linux环境下,线程是最小的执行单位,进程是最小的资源分配单位。
mindtechnist
2024/08/08
1940
【Linux线程】线程控制原语详细介绍
Linux内核编程--进程控制,线程控制,锁机制
每个进程都有一个非负整型表示的唯一进程ID。进程ID是可复用的,当一个进程终止后,其进程ID也会被其他进程使用。
Coder-ZZ
2022/05/09
1.3K0
Linux内核编程--进程控制,线程控制,锁机制
【linux学习指南】Linux线程创建&&终止&&等待&&分离与多线程创建
同⼀地址空间,因此TextSegment、DataSegment都是共享的,如果定义⼀个函数,在各线程中都可以调⽤,如果定义⼀个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
学习起来吧
2025/02/09
4230
【linux学习指南】Linux线程创建&&终止&&等待&&分离与多线程创建
Linux系统编程-(pthread)线程的使用案例(分离属性、清理函数等)
这篇文章介绍Linux下线程的创建与基本使用案例,主要是案例代码为主;相关的函数详细介绍在上篇文章里已经介绍过了。
DS小龙哥
2022/02/17
1.1K0
推荐阅读
相关推荐
线程源码分析之cancel.c(基于linuxthreads2.0.1)
更多 >
交个朋友
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档