day7 线程的取消和清理

news2024/7/6 18:09:08

线程的取消

意义:随时杀掉一个线程

int pthread_cancel(pthread_t thread);

注意:线程的取消要有取消点才可以,不是说取消就取消,线程的取消点主要是阻塞的系统调用

如果没有取消点,手动设置一个;

void pthread_testtcancel(void);

 代码实现:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void *func(void *arg) {
	printf("this is child thread\n");
	while(1) {
		sleep(5);
        pthread_testcancel();
	}
	pthread_exit("thread return");
}

int main() {
	pthread_t tid;
	void *retv;
	int i;
	pthread_create(&tid, NULL, func, NULL);
	sleep(5);
	pthread_cancel(tid);
	pthread_join(tid, &retv);

	while(1) {
		sleep(1);
	}
}

运行结果:

运行段错误:

可以使用gdb调试;

1、使用gdb编译代码;

gcc -g -o xxx xxx.c

 2、使用gdb运行程序;

gdb ./xxx

3、运行之后使run命令;

(gdb)run

等待出现Thread 1 "xxx" received signal SIGSEGV, Segmentation fault.

4、输入命令bt(打印调用栈)

(gdb) bt

#0  0x00007ffff783ecd0 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff78458a9 in printf () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00000000004007f9 in main () at xxx.c:21

确定段错误位置是xxx.c21行

设置取消属性

int pthread_setcancelstate(int state, int *oldstate);
PTHREAD_CANCEL_ENABLE  
PTHREAD_CANCEL_DISABLE

设置不能取消:PTHREAD_CANCEL_ENABLE

设置可以取消:PTHREAD_CANCEL_DISABLE

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void *func(void *arg) {
	printf("this is child thread\n");

    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
//设置程序5秒之前不可取消

	while(1) {
		sleep(5);
        pthread_testcancel();
	}
    
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
//设置程序5秒之后可以取消

    while(1) {
		sleep(1);
	}
    
	pthread_exit("thread return");
}

int main() {
	pthread_t tid;
	void *retv;
	int i;
	pthread_create(&tid, NULL, func, NULL);
	sleep(1);
	pthread_cancel(tid);
	pthread_join(tid, &retv);

	while(1) {
		sleep(1);
	}
}

设置取消类型:

int pthread_setcanceltype(int type, int *oldtype);
PTHREAD_CANCEL_DEFERRED     
PTHREAD_CANCEL_ASYNCHRONOUS      

等到取消点才取消:PTHREAD_CANCEL_DEFERRED

目标线程会立即取消:PTHREAD_CANCEL_ASYNCHRONOUS

线程的清理

必要性:当线程非正常终止,需要清理一些资源

void pthread_cleanup_push(void (*routine) (void *), void *arg)
void pyhread_cleanup_pop(int execute)

routine函数被执行的条件:

1、被pthread_cancel取消掉;

2、执行pthread_exit;

3、非0参数执行pthread_cleanup_pop()

注意:

1、必须成对使用,即使pthread_cleanup_pop不会被执行也要必须写上,否则编译会错误;

2、pthread_cleanup_pop()被执行且参数为0,pthread_cleanup_push回调函数routine不会被执行;

3、pthread_cleanup_push 和 pthread_cleanup_pop 可以写多对,routine执行顺序正好相反(类似于栈先进后出)

4、线程内的return 可以结束线程,也可以给pthread_join 返回值,但不能触发pthread_cleanup_push里面的回调函数,所以我们结束线程尽量使用pthread_exit退出线程。

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

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

相关文章

【网络应用开发】实验4——会话管理

目录 会话管理预习报告 一、实验目的 二、实验原理 三、实验预习内容 1. 什么是会话&#xff0c;一个会话的生产周期从什么时候&#xff0c;到什么时候结束&#xff1f; 2. 服务器是如何识别管理属于某一个特定客户的会话的&#xff1f; 3. 什么是Cookie&#xff0c;它的…

全网最详细,Python接口自动化测试接口加密实战,框架撸码.......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 如果接口测试仅仅只…

【驱动开发】Windows过滤平台(WFP,Windows Filtering Platform)

文章目录Windows的发展历程TDI简介WFP简介用户态基础过滤引擎&#xff08;BFE&#xff09;内核态过滤引擎&#xff08;KMFE&#xff09;垫片&#xff08;Shim&#xff09;分层&#xff08;Layer&#xff09;子层&#xff08;Sub Layer&#xff09;过滤器&#xff08;Filter&…

【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)

可在系列教程的基础上继续开发&#xff0c;也可以单独使用 【微信小程序-原生开发】系列教程 效果预览 代码实现 点击触发生成海报 在活动详情页&#xff0c;指定点击某图标/按钮&#xff0c;触发跳转到生成海报的页面 pages\components\party\detail\index.js getPoster() …

OpenTex 企业内容管理平台

OpenText 企业内容管理平台 将内容服务与领先应用程序集成&#xff0c;弥合内容孤岛、加快信息流并扩大治理 什么是内容服务集成&#xff1f; 内容服务集成通过将内容管理平台与处于流程核心的独立应用程序和系统连接起来&#xff0c;支持并扩展了 ECM 的传统优势。 最好的内…

【通过Cpython3.9源码看看python字符串对象的创建】

CPython源码解析之PyUnicode_New函数实现 简介 PyUnicode_New是Python源码中用于创建Unicode字符串对象的函数&#xff0c;定义在UnicodeObject.c文件中。该函数接受一个长度参数size和最大字符值参数maxchar(根据传入的最大字符值 maxchar 确定新创建的字符串对象所需的存储…

百度工程师的软件质量与测试随笔

作者 | 百度移动生态质效工程师们 导读 在降本增效、以chatGPT为代表的大模型技术横空出世的背景下&#xff0c;对软件质量和软件测试的领域也带来了巨大冲击&#xff0c;也使得软件质量工作者开始变得焦虑&#xff0c;主要体现在&#xff1a;公司对软件质量从业者的不重视加剧…

SQL Server的执行计划(Execution Plans)

执行计划一、背景二、显示和保存执行计划三、显示估计的执行计划四、显示实际执行计划五、以 XML 格式保存执行计划六、比较和分析执行计划6.1、比较执行计划6.2、分析实际执行计划总结一、背景 为了能够执行查询&#xff0c;SQL Server 数据库引擎必须分析该语句&#xff0c;…

21100颗星的Locust性能测试工具到底有多牛!

一句话&#xff1a;用普通的Python编写可扩展的负载测试&#xff0c;就够了&#xff0c;懂得自然懂&#xff01; Locust是一个易于使用、可编写脚本和可扩展的性能测试工具。你在常规的Python代码中定义你的用户的行为&#xff0c;而不是受制于一个UI或领域特定的语言&#xff…

HTB-Obscurity

HTB-Obscurity信息收集8080端口立足www-data -> robertrobert -> rootsudo 注入hash捕获信息收集 8080端口 ”如果攻击者不知道你在使用什么软件&#xff0c;你就不会被黑客攻击!“&#xff0c;目标对web的指纹做了某些处理。 “‘SuperSecureServer.py’ in the secre…

【从零开始学Skynet】基础篇(六):MySql数据库安装操作

游戏服务端的另一项重要功能是保存玩家数据&#xff0c;Skynet提供了操作MySQL数据库、MongoDB数据库的模块。1、数据库安装 首先安装Mysql服务器&#xff0c;打开终端输入如下指令&#xff1a; sudo apt-get install mysql-server 按下回车&#xff0c;输入密码后开始安装&a…

秒杀架构(二) -- nginx实现限流

限流&#xff08;Rate Limitting&#xff09;是服务降级的一种方式&#xff0c;通过限制系统的输入和输出流量以达到保护系统的目的。比如我们的网站暴露在公网环境中&#xff0c;除了用户的正常访问&#xff0c;网络爬虫、恶意攻击或者大促等突发流量都可能都会对系统造成压力…

OpenCV按指定大小分割图像并保存详细讲解

这几天在忙着整理自己的数据集&#xff0c;使用工业级相机拍了好多高清照片&#xff0c;但是模型训练的时候需要使用512*512像素点大小的图像&#xff0c;而且我的模型设计的时候就已经规定好了训练样本大小。 那就分割呗&#xff0c;把拍的照片按512*512分割一小块一小块的&am…

easyx

普通的画线图什么的 首先我们需要安装一个easyx的图形库&#xff0c;然后把头文件搞出来 #include <stdio.h> #include <easyx.h>//easyx画线啥啥的图形库 #include <graphics.h> #include <math.h> #include <conio.h>//键盘操作的头文件 设…

2023年mathorcupD题航空安全风险分析和飞行技术评估思路分析

2023年mathorcupD题航空安全风险分析和飞行技术评估思路分析 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快 速发展&#xff0c;针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日&#xff0c;“3.21” 空难的发生终结了中国民航安全飞行 1 亿零 59…

Android中级——性能优化

性能优化布局优化UI渲染机制避免Overdraw优化布局层级利用<include\>重用Layout使用<ViewStub\>实现View的延迟加载Hierarchy View内存优化获取内存信息ProfilerTraceViewMAT&#xff08;Memory Analyzer Tool&#xff09;dumpsys布局优化 UI渲染机制 画面流畅需…

透过Gartner最新报告,认识“超级边缘”

当下&#xff0c;酝酿能量的超级边缘。最近&#xff0c;我们在谈视频化狂飙、谈AIGC颠覆、谈算力动能不足&#xff0c;很少谈及边缘。但“边缘”恰恰与这一切相关&#xff0c;且越发密不可分&#xff0c;它是未来技术发展的极大影响因子。 “到2025年&#xff0c;超过70%的组织…

Segment Anything Model

论文翻译&#xff1a; 图1&#xff1a;我们旨在通过引入三个相互关联的组件来构建分割的基础模型&#xff1a;即时分割任务、支持数据注释并通过即时工程将零样本传输到一系列任务的分割模型&#xff08;SAM&#xff09;&#xff0c;以及用于收集SA-1B的数据引擎&#xff0c;SA…

MappingGenerator PRO 2023.3 Visual Studio 2019-2022

您的私人编码助手 MappingGenerator 最初是作为 AutoMapper 的设计时替代品创建的。现在它正在演变为编码助手&#xff0c;您可以将最平凡的编码任务委派给它&#xff1a; 生成映射生成显式转换实施克隆生成投影表达式脚手架方法调用脚手架对象创建清理方法调用方便ILogger的使…

探讨Hive是否转为MapReduce程序

目录 前提条件 数据准备 探讨HQL是否转为MapReduce程序执行 1.设置hive.fetch.task.conversionnone 2.设置hive.fetch.task.conversionminimal 3.设置hive.fetch.task.conversionmore 前提条件 Linux环境下安装好Hive&#xff0c;这里测试使用版本为&#xff1a;Hive2.3.…