Linux 线程控制 —— 线程取消 pthread_cancel

news2024/12/23 5:32:48

线程退出pthread_exit只能终止当前线程,也就是哪个线程调用了pthread_exit,哪个线程就会退出;但是线程取消pthread_cancel ,不光可以终止自己,还可以终止其他线程。

==》自己终止自己,没问题!

==》主线程调用pthread_cancel来终止子线程,没问题!

==》子线程调用pthread_cancel来终止主线程,也没有问题!(只不过这种不大常见)


目录

1、认识 pthread_cancel 函数

(1) pthread_cancel 函数介绍

(2) pthread_cancel函数实际应用:子线程自我终止、子线程终止主线程

2、其他线程取消相关函数

(1) 取消点设置函数 pthread_testcancel (了解)

(2) 线程取消使能 pthread_setcancelstate(了解)

(3) 线程取消类型设置 pthread_setcanceltype(了解)


1、认识 pthread_cancel 函数

(1) pthread_cancel 函数介绍

参数是线程ID,也就是你希望终止哪个线程;成功返回0,失败返回一个错误码。pthread_cancel 使用的前提条件是 被终止的线程有取消点,即阻塞的系统调用如sleep函数

(2) pthread_cancel函数实际应用:子线程自我终止、子线程终止主线程

==========================子线程自我终止==========================

子线程自我终止 和 主线程终止子线程的效果是一样的,这里就只演示子线程自我终止的情况,核心代码如下,此时需要留意一下返回值

 测试结果如下,我们发现,子线程提前终止,居然还会有返回值,返回值是-1,其实-1在Linux中代表的就是 PTHREAD_CANCELED

 站在OS的角度,结果如下

 ==========================子线程终止主线程==========================

一般来说,不建议这么做,因为主线程会等待回收子线程,子线程退出就有人回收;但是子线程不会去回收主线程,所以主线程退出的时候,由于没有人回收,这个时候,主线程就会出现类似于“僵尸进程”的情况

测试结果如下,我们会发现,主线程的旁边有一个 <defunct>,defunct是死者的意思,说明这个线程已经死了,类似于“僵尸进程”

2、其他线程取消相关函数

(1) 取消点设置函数 pthread_testcancel (了解)

上面提到,被终止的线程必须要有取消点,如果没有取消点,这里可以自己手动设置一个取消点,这样的话无需 sleep 函数就可以实现线程取消了。函数声明如下:

void* thread_run(void* args)
{
    pthread_testcancel();        // 设置取消点
}

int main(){
    pthread_t tid;
    pthread_create(&tid, NULL, thread_run, NULL);

    pthread_cancel(tid);        // 取消子线程
}

(2) 线程取消使能 pthread_setcancelstate(了解)

默认情况下,线程是可以被取消的,但是你如果不希望线程被取消,可以使用 pthread_setcancelstate 函数来禁止线程被取消,哪个线程要设置取消使能,那就放在哪个线程里。函数声明如下:

第一个参数state:设置线程是否取消。可选值如下:

  • PTHREAD_CANCEL_ENABLE:允许当前线程取消
  • PTHREAD_CANCEL_DISABLE:禁止当前线程被取消

第二个参数 oldstate:这是一个输出型参数,输出上一次线程的使能状态

void* thread_run(void* args)
{
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE);  // 此时该线程不可被取消(在取消点之前)

    pthread_testcancel();        // 设置取消点
    // ...
}

int main(){
    pthread_t tid;
    pthread_create(&tid, NULL, thread_run, NULL);

    pthread_cancel(tid);        // 取消子线程
}

(3) 线程取消类型设置 pthread_setcanceltype(了解)

线程取消类型有两种,一种是遇到取消点再取消线程;另一种是目标线程会立马取消。默认是遇到取消点再取消。函数声明如下:

第一个参数 type:设置线程取消的类型。可选值如下:

  •  PTHREAD_CANCEL_DEFERRED等到取消点才取消
  • PTHREAD_CANCEL_ASYNCHRONOUS目标线程会立即取消

第二个参数 oldtype:输出型参数。返回上一次的取消类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android ViewPager2 + TabLayout + BottomNavigationView

Android ViewPager2 TabLayout BottomNavigationView 实际案例 本篇主要介绍一下 ViewPager2 TabLayout BottomNavigationView 的结合操作 概述 相信大家都看过今日头条的的样式 如下: 顶部有这种tab 并且是可以滑动的, 这就是本篇所介绍的 ViewPager2 TabLayout 的组合…

【C++】C++实战项目机房预约管理系统

前言 这是C总结性练习&#xff0c;主要以一个综合案例对以前学过的知识进行复习巩固&#xff0c;为以后编程打下基础。 1. 机房预约系统需求 1.1 系统简介 学校有几个规格不同的机房&#xff0c; 由于使用时经常出现“撞车”现象&#xff0c;现开发一套机房预约系统&#x…

[附源码]JAVA毕业设计会议室租赁管理系统(系统+LW)

[附源码]JAVA毕业设计会议室租赁管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

EMC原理 传导(共模 差模) 辐射(近场 远场) 详解

第一章、EMC概念介绍 EMC&#xff08;electromagnetic compatibility&#xff09;作为产品的一个特性&#xff0c;译为电磁兼容性&#xff1b;如果作为一门学科&#xff0c;则译为电磁兼容。它包括两个概念&#xff1a;EMI和EMS。EMI(electromagneticinterference) 电磁干扰&a…

从Github上整理下来的《Java面试神技》

该文档曾在Github上线6天&#xff0c;共收获55Kstar的Java面试神技&#xff08;这赞数&#xff0c;质量多高就不用我多说了吧&#xff09;非常全面&#xff0c;包涵Java基础、Java集合、JavaWeb、Java异常、OOP、IO与NIO、反射、注解、多线程、JVM、MySQL、MongoDB、Spring全家…

通俗易懂帮你理清操作系统(Operator System)

文章目录概念&#xff08;是什么&#xff09;设计OS的目的&#xff08;为什么&#xff09;如何理解 "管理"&#xff08;怎么办&#xff09;总结系统调用和库函数概念概念&#xff08;是什么&#xff09; 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作…

照亮无尽前沿之路:华为正成为科技灯塔的守护者

20世纪中叶&#xff0c;著名科学家、工程师&#xff0c;被誉为“信息时代之父”的范内瓦布什&#xff0c;在《科学&#xff1a;无尽的前沿》中讨论了科学战略与科学基础设施对科技发展的重要性。其中提出&#xff0c;人类科技发展已经从以个人、学校为单位&#xff0c;来到了以…

【能效管理】关于学校预付费水电系统云平台应用分析介绍

概述 安科瑞 李亚俊 壹捌柒贰壹零玖捌柒伍柒 当下智慧校园、平安校园的建设越来越普及&#xff0c;作为智慧校园建设的重要一环&#xff0c;学生宿舍的用电预付费和用电管理措施是必不可少的。学生宿舍预付费电控系统可以解决使用传统电表人工抄表费时费力&#xff0c;不方便统…

[附源码]JAVA毕业设计基于MVC框架的在线书店设计(系统+LW)

[附源码]JAVA毕业设计基于MVC框架的在线书店设计&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 …

光源基础(2)——光的强度、波长、颜色合成与互补关系

光源基本参数 光的度量 辐射能和光能 以辐射形式发射、传播或接收的能量称为辐射能&#xff0c;其计量单位为焦耳(J)。光能是光通量在可见光范围内对时间的积分&#xff0c;其计量单位为流明秒(lms)。 辐射通量和光通量 辐射通量或辐射功率是以辐射形式发射、传播或接收的功率…

【servelt原理_4_Http协议】

Http协议 1.认识url url被称为统一资源定位符&#xff0c;用来表示从互联网上得到的资源位置和访问这些资源的方法。 他的表示方法一般为&#xff1a; <协议>://<主机>:<端口>/<路径>如下我们启动一个servlet程序&#xff0c;来看一下我们的url表示 …

Yolov5 基本环境(cpu)搭建记录

Yolov5 基本环境(cpu)搭建记录 软件包&#xff1a; 1.anaconda&#xff08;https://www.anaconda.com/&#xff09; 2.pycharm&#xff08;https://www.jetbrains.com/pycharm/&#xff09; 3.torchvision-0.11.0cpu-cp37-cp37m-win_amd64.whl&#xff08;https://download.py…

Node.js学习上(67th)

1、基础内容 1、命令行 1、CMD命令 1、dir&#xff1a;列出当前目录下的所有文件 2、cd 目录名&#xff1a;进入指定目录 3、md 目录名&#xff1a;新建文件夹 4、rd 目录名&#xff1a;删除文件夹 5、a.txt&#xff1a;直接打开当前目录下的文件 2、目录 1、.&#xff1a…

Spring Security源码(三) 授权分析

通过前面的分析我们知道经过filterchain的层层赛选后,请求来到了FilterSecurityInterceptor进行权限校验,那么其底层是如何实现的呢,通过本文带你了解其底层实现原理 一 授权流程整体分析 当客户端向某个资源发起请求&#xff0c;请求到达FilterSecurityInterceptor&#xff0…

PYTHON链家租房数据分析:岭回归、LASSO、随机森林、XGBOOST、KERAS神经网络、KMEANS聚类、地理可视化...

全文下载链接:http://tecdat.cn/?p29480作者&#xff1a;Xingsheng Yang1 利用 python 爬取链家网公开的租房数据&#xff1b;2 对租房信息进行分析&#xff0c;主要对房租相关特征进行分析&#xff0c;并搭建模型用于预测房租&#xff08;点击文末“阅读原文”获取完整代码数…

Docker基础组件、安装启动和Docker生命周期

Docker安装部署 Docker引擎 运行镜像生成容器。应用程序跑在容器中 Docker Daemon 安装使用Docker&#xff0c;得先运行Docker Daemon进程&#xff0c;用于管理Docker&#xff0c;如&#xff1a; 镜像 images容器 containers网络 network数据卷 Data Volumes Rest接口 提…

【数据结构】图的实现

文章目录图1.图的基本概念2.图的存储结构3.邻接矩阵3.1邻接矩阵的优缺点3.2邻接矩阵的实现4.邻接表4.1邻接表的实现5.图的遍历5.1广度优先遍历5.2深度优先遍历5.3如何遍历不连通的图&#xff1f;图 1.图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1…

第二章 使用Maven:IDEA环境

前一章是在命令行环境下用Maven&#xff0c;也是为我们之后的操作打一个基础&#xff0c;但我想了一下&#xff0c;以后应该用得不多&#xff0c;所以这里就跳过了&#xff0c;直接学在IDEA中Maven的使用 我这里就直接简化笔记了&#xff0c;只把知识大致的整体架构写出来 一.创…

yolov5量化注意事项(二)

一、引言 前面的博文&#xff0c;是PTQ的注意事项。本篇文章是记录QAT部分需要修改的一些要点。 注&#xff1a;本文仅供自己的笔记作用&#xff0c;防止未来自己忘记一些坑的处理方式 QAT的大致流程&#xff1a;&#xff08;1&#xff09;训练生成基础模型&#xff0c;通常是…

Linux系统中驱动格式基本实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;编写Linux驱动格式与方法。 目录 第一&#xff1a;基本格式实验 1、编写外设结构体 2、定义IO复用寄存器组的基地址 3、定义访问指针 第二&#xff1a;实验程序编写 第一&#xff1a;基本格式实验 可以利用模仿C语言中结构…