当前位置: 首页 > news >正文

C++11打断线程的几种方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、pthread_cancel
    • 1.代码演示
    • 2.两个重要方法
      • 1.pthread_setcancelstate
      • 2.pthread_setcanceltype
    • 3.资源回收
  • 二、Boost
    • 1.看代码
    • 2.资源泄露
    • 2.资源回收
  • 总结


前言

我们都知道在C++11中可以方便启动一个或多个线程,常规的手段是让线程执行完任务后自己结束自己,或者在达成一定的条件时退出。如果,我想在运行途中停下来怎么办?这篇文章就提供几种可行的方法。

取消点:线程并不是所有时刻都可以打断,只有当线程到达取消点的时候才可能被取消,通俗来说就是阻塞。诸如join、wait、sleep、IO操作都是典型的取消点。


一、pthread_cancel

这个是C形式的线程取消方式,搭配pthread_create方式创建的线程使用。

1.代码演示

main.cpp

#include <iostream>
using namespace std;void *p_(void *) {printf("start\n");for (int i = 0; i < 100000; ++i) {if (i == 1000)printf("block\n");}printf("end\n");return nullptr;
}void pthread_() {pthread_t p;pthread_create(&p, nullptr, p_, nullptr);pthread_cancel(p);pthread_join(p, nullptr);
}int main() {pthread_();return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.22)
project(Thread)set(CMAKE_CXX_STANDARD 11)
find_package(Threads REQUIRED)
add_executable(Thread main.cpp)
target_link_libraries(Thread Threads::Threads)

打印:start
说明程序正好在printf("start\n");这句被结束掉了。如果你将主线程sleep下,就可以执行到printf("block\n");printf("end\n");这句没有执行到,也正好符合终止线程的意图。

2.两个重要方法

pthread_cancel还有两个重要方法搭配使用,pthread_setcancelstatepthread_setcanceltype

1.pthread_setcancelstate

设置线程对cancel信号的响应策略,有两个可选项PTHREAD_CANCEL_ENABLEPTHREAD_CANCEL_DISABLE,前者是默认的选项,表示响应pthread_cancel的调用,并设置为cancel状态;后者是说线程忽略信号,调用pthread_cancel的线程阻塞到可取消状态为止。

2.pthread_setcanceltype

设置线程对cancel信号的返回类型,也有两个可选项PTHREAD_CANCEL_DEFERREDPTHREAD_CANCEL_ASYNCHRONOUS,前者是默认状态,表示线程运行到下一个取消点才退出;后者意思是直接退出,不用等线程运行到下一个取消点

注意:pthread_setcanceltype设置必须先将pthread_setcancelstate设置为enable状态才会生效!

3.资源回收

直接执行pthread_cancel会引发资源泄露的问题,请看代码:

#include <iostream>
using namespace std;void *p_(void *) {auto a = new int{1};printf("start\n");for (int i = 0; i < 100000; ++i) {if (i == 1000)printf("block\n");}printf("end\n");return nullptr;
}void pthread_() {pthread_t p;pthread_create(&p, nullptr, p_, nullptr);pthread_cancel(p);pthread_join(p, nullptr);
}int main() {pthread_();return 0;
}

使用valgrind测试发现4字节的内存泄露。
在这里插入图片描述

资源回收的方法是有的,但是我更推荐使用Boost的方法,所以这里不深究了,感兴趣的请自行研究。

二、Boost

相比于pthread我觉得Boost的thread更好用。典型的C++书写方式,而且方法少而简单。只是不知道为什么C++11标准里没有interrupt这个函数(留待后续研究),使用起来也没发现什么问题,毕竟需要打断线程的场景其实不多。

1.看代码

main.cpp

#include <iostream>
#include <boost/thread.hpp>void thread_() {try {for (int i = 0; i < 100000; ++i) {std::cout << i << std::endl;boost::this_thread::sleep(boost::posix_time::seconds(1));}} catch (boost::thread_interrupted) {std::cout << "interrupted" << std::endl;}
}int main(int argc, char **argv) {boost::thread t(thread_);t.interrupt();t.join();return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.22)
project(Boost_1_74_0)set(CMAKE_CXX_STANDARD 11)
find_package(Boost 1.74 REQUIRED COMPONENTS thread)
add_executable(thread thread.cpp)
target_link_libraries(thread Boost::thread)

执行:
0
interrupted

触发了异常之后结束了。

2.资源泄露

看代码:

#include <iostream>
#include <boost/thread.hpp>void thread_() {auto a = new int{1};try {for (int i = 0; i < 100000; ++i) {std::cout << i << std::endl;boost::this_thread::sleep(boost::posix_time::seconds(1));}} catch (boost::thread_interrupted) {std::cout << "interrupted" << std::endl;}
}int main(int argc, char **argv) {boost::thread t(thread_);t.interrupt();t.join();return 0;
}

运行valgrind,等待程序结束。
在这里插入图片描述

2.资源回收

方法很简单,Boost对interrupt做了异常包装,触发异常之后直接回收资源就行了。
看代码:

#include <iostream>
#include <boost/thread.hpp>void thread_() {auto a = new int{1};try {for (int i = 0; i < 100000; ++i) {std::cout << i << std::endl;boost::this_thread::sleep(boost::posix_time::seconds(1));}} catch (boost::thread_interrupted) {std::cout << "interrupted" << std::endl;delete a;//这一句,资源回收}
}int main(int argc, char **argv) {boost::thread t(thread_);t.interrupt();t.join();return 0;
}

运行valgrind,等待程序结束。所有资源都被回收了。


总结

1、优先使用Boost的方法,没别的原因,就是简单。
2、当然线程自身也可以打断自己,只不过我一般选择标志或自动结束更简单些。

相关文章:

C++11打断线程的几种方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pthread_cancel1.代码演示2.两个重要方法1.pthread_setcancelstate2.pthread_setcanceltype 3.资源回收 二、Boost1.看代码2.资源泄露2.资源回收 总结 前言…...

如何提升网站排名和用户体验:优化网站速度

网站的排名和用户满意度直接受到站点内容的加载速度影响深远。通过精心的网站优化&#xff0c;您不仅可以提高排名&#xff0c;还可以提供更出色的用户体验&#xff0c;尽管用户可能不会察觉到您的网站加载得更快&#xff0c;但这是一个非常有意义的改进。在这篇文章中&#xf…...

【Redis】Hash 哈希内部编码方式

Hash 哈希内部编码方式 哈希的内部编码有两种&#xff1a; ziplist&#xff08;压缩列表&#xff09;&#xff1a;当哈希类型元素个数⼩于hash-max-ziplist-entries配置&#xff08;默认512个&#xff09;、同时所有值都⼩于hash-max-ziplist-value配置&#xff08;默认64字节…...

JUC第二十八讲:JUC工具类: Semaphore详解

JUC工具类: Semaphore详解 本文是JUC第二十八讲&#xff0c;JUC工具类: Semaphore详解。Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量&#xff0c;它允许n个任务同时访问某个资源&#xff0c;可以将信号量看做是在向外分发使用资源的许可证…...

vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景

vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景 目录 vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景一、问题背景二、解决方法三、示例 一、问题背景 代码环境&#xff1a;vue3 &#xff0…...

【Qt之QTableWidget和QTreeWidget】树悬停、选择样式及表格表头和首行间隔线

QTableWidget设置表头与首行间隔线 win10 实例化QTableWidget后&#xff0c;表格表头和首行中间无间隔线&#xff0c;以下是通过样式表进行设置&#xff1a; // 设置横向表格头的间隔线&#xff0c;可设置四个方向的间隔线,不需要间隔线的可以设置为0px// border-left:0px sol…...

使用余弦算法计算向量相似性

import pandas as pd import numpy as np import openaifrom openai.embeddings_utils import get_embedding, cosine_similarityopenai.api_key sk-???? embedding_model "text-embedding-ada-002" embedding_encoding "cl100k_base" # this the …...

存档&改造【06】Apex-Fancy-Tree-Select花式树的使用误删页数据还原(根据时间节点导出导入)

之前一直想实现厂区-区域-产线之间的级联选取&#xff0c;于是导入插件Apex-Fancy-Tree-Select花式树 存档&#xff06;改造【03】Apex-Fancy-Tree-Select花式树的导入-CSDN博客 现在则是在Oracle Apex中的应用 花式书级联列表展示厂区-区域-产线 想要实现的效果 由厂区>…...

OpenCV7-copyTo截取ROI

OpenCV7-copyTo截取ROI copyTo截取感兴趣区域 copyTo截取感兴趣区域 有时候&#xff0c;我们只对一幅图像中的部分区域感兴趣&#xff0c;而原图像又十分大&#xff0c;如果带着非感兴趣区域一次处理&#xff0c;就会对程序的内存造成负担&#xff0c;因此我们希望从原始图像中…...

OpenCV10-图像直方图:直方图绘制、直方图归一化、直方图比较、直方图均衡化、直方图规定化、直方图反射投影

OpenCV10-图像直方图&#xff1a;直方图绘制、直方图归一化、直方图比较、直方图均衡化、直方图规定化、直方图反射投影 1.直方图的绘制2.直方图归一化3.直方图比较4.直方图均衡化5.直方图规定化&#xff08;直方图匹配&#xff09;6.直方图反向投影 1.直方图的绘制 图像直方图…...

线性回归模型进行特征重要性分析

目的 线性回归是很常用的模型&#xff1b;在局部可解释性上也经常用到。 数据归一化 归一化通常是为了确保不同特征之间的数值范围差异不会对线性模型的训练产生过大的影响。在某些情况下&#xff0c;特征归一化可以提高模型的性能&#xff0c;但并不是所有情况下都需要进行归一…...

hadoop -hive 安装

1.下载hive http://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz2.解压/usr/app 目录 tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /usr/app3.设置软连接 ln -s /usr/app/apache-hive-3.1.3-bin /usr/app/hive4.修改/usr/app/hive/conf/hive-env.…...

小迈物联网网关对接串口服务器[Modbus RTU]

很多工控现场&#xff0c;方案中会使用串口服务器采集Modbus RTU的设备&#xff0c;这种情况下一般会在PC机上装上串口服务器厂家的软件来进行数据采集。如果现场不需要PC机&#xff0c;而是通过网关将数据传输到软件平台&#xff0c;如何实现呢&#xff1f; 本文简要介绍小迈网…...

Java版本+企业电子招投标系统源代码+支持二开+招投标系统+中小型企业采购供应商招投标平台

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…...

Vue3中reactive, onMounted, ref,toRaw,conmpted 使用方法

import { reactive, onMounted, ref,toRaw,conmpted } from vue; vue3中 reactive &#xff0c;ref &#xff0c; toRaw&#xff0c;watch&#xff0c;conmpted 用法 toRaw 返回原响应式对象 用法&#xff1a; const rowList toRaw(row) reactive:ref: ref和reactive都是V…...

有哪些免费的PPT模板网站,推荐这6个PPT模板免费下载网站!

混迹职场的打工人&#xff0c;或是还在校园的学生党&#xff0c;在日常的工作汇报或课程作业中&#xff0c;必然少不了PPT的影子&#xff0c;而每当提到做PPT&#xff0c;许多人首先会想到&#xff1a;有哪些免费的PPT模板下载网站&#xff1f; 本着辛苦自己&#xff0c;造福所…...

剧院建筑三维可视化综合管控平台提高安全管理效率

随着数字孪生技术的高速发展&#xff0c;智慧楼宇也被提上日程&#xff0c;以往楼宇管理存在着设备故障排查困难、能源浪费与管理不足、安全性和风险高等问题&#xff0c;而智慧楼宇数字孪生可视化中控平台&#xff0c;打造智慧楼宇管理一张图&#xff0c;实现了智慧建筑和楼宇…...

“过度炒作”的大模型巨亏,Copilot每月收10刀,倒赔20刀

大模型无论是训练还是使用&#xff0c;都比较“烧钱”&#xff0c;只是其背后的成本究竟高到何处&#xff1f;已经推出大模型商用产品的公司到底有没有赚到钱&#xff1f;事实上&#xff0c;即使微软、亚马逊、Adobe 这些大厂&#xff0c;距离盈利之路还有很远&#xff01;同时…...

顺序表经典的OJ题

题目一 移除元素&#xff1a; 题目要求&#xff1a; 给你一个数组 nums 和一个值 val。你需要 原地 除所有数值等于 val 的素&#xff0c;并返回移除后数组的新长度.不要使用额外的数组空间。你必须仅使用 0(1) 额外空间并 原地 修改输入数组元素的顺序可以改变。你不需要考虑数…...

video_topic

使用qt5,ffmpeg6.0,opencv&#xff0c;os2来实现。qt并非必要&#xff0c;只是用惯了。 步骤是&#xff1a; 1.读取rtsp码流&#xff0c;转换成mat图像 2.发送ros::mat图像 项目结构如下&#xff1a; videoplayer.h #ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H#include …...

uniapp获取公钥、MD5,‘keytool‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

获取MD5、SHA1、SHA256指纹信息 通过命令的形式获取 winr调出黑窗口cd到证书所在目录输入keytool -list -v -keystore test.keystore,其中 test.keystore为你的证书名称加文件后缀按照提示输入你的证书密码&#xff0c;就可以查看证书的信息 通过uniapp云端查看(证书是在DClou…...

Jetson Orin NX 开发指南(5): 安装 OpenCV 4.6.0 并配置 CUDA 以支持 GPU 加速

一、前言 Jetson 系列的开发板 CPU 性能不是很强&#xff0c;往往需要采用 GPU 加速的方式处理图像数据&#xff0c;因此本文主要介绍如何安装带有 GPU 加速的 OpenCV&#xff0c;其中 GPU 加速通过 CUDA 来实现。 参考博客 Ubuntu 20.04 配置 VINS-Fusion-gpu OpenCV 4.6.…...

Spring Security 6.x 系列【67】认证篇之安装 ApacheDS

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列Spring Security 版本 6.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 概述2. 安装3. 连接工具1. 概述 官方文档 在前两篇文档中,我们简单了…...

理解线程池源码 【C++】面试高频考点

理解线程池 C 文章目录 理解线程池 C程序源码知识点emplace_back 和 push_back有什么区别&#xff1f;互斥锁 mutexcondition_variablestd::move()函数bind()函数join 函数 线程池的原理就是管理一个任务队列和一个工作线程队列。 工作线程不断的从任务队列取任务&#xff0c;然…...

BP神经网络应用案例

目录 背景介绍 【神经网络符号说明】 【建立网络拓扑结构】 【神经网络学习步骤】 步骤1 准备输入和输出样本 步骤2 确定网络学习参数 步骤3 初始化网络权值W和阀值B 步骤4 计算网络第一层的输入和输出 步骤5 计算中间层&#xff08;隐含层输入和输出&#xff09; 步骤…...

日常学习记录随笔-大数据之日志(hadoop)收集实战

数据收集(nginx)--->数据分析---> 数据清洗--->数据聚合计算---数据展示 可能涉及到zabix 做任务调度我们的项目 电商日志分析 比如说我们现在有一个系统,我们的数仓建立也要有一个主题 我这个项目是什么我要干什么定义方向 对用户进行分析,用户信息 要懂整个数据的流…...

【云计算】相关解决方案介绍

文章目录 1.1 云服务环境 Eucalyptus1.1.1 介绍1.1.2 开源协议及语言1.1.3 官方网站 1.2 开源云计算平台 abiCloud1.2.1 开源协议及语言1.2.2 官方网站 1.3 分布式文件系统 Hadoop1.3.1 开源协议及语言1.3.2 官方网站 1.4 JBoss云计算项目集 StormGrind1.4.1 开源协议及语言1.4…...

攻防世界题目练习——Crypto密码新手+引导模式(二)(持续更新)

题目目录 1. 转轮机加密2. easychallenge 上一篇&#xff1a;攻防世界题目练习——Crypto密码新手引导模式&#xff08;一&#xff09;&#xff08;持续更新&#xff09; 1. 转轮机加密 首先了解一下轮转机加密吧。 传统密码学(三)——转轮密码机 题目内容如下&#xff1a; …...

LeetCode【1】两数之和

题目&#xff1a; 代码&#xff1a; public int[] twoSum(int[] nums, int target) {int[] result new int[2];Map<Integer, Integer> map new HashMap<>();// for (int i 0; i < nums.length; i) { // 这么写不能防重复啊&#xff01;注意这里不…...

【运维笔记】VMWare 另一个程序已锁定文件的一部分,进程无法访问

情景再现 这里使用的是VMware 17 解决办法 进入设置 点击选项&#xff0c;全选复制里面内容 进入文件夹&#xff0c;删除所有包含.lck后缀的文件和文件夹 再启动虚拟机即可...