当前位置: 首页 > 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 …...

Z-Image-Turbo_Sugar脸部Lora效果增强:ControlNet+Lora联合调控Sugar脸部结构

Z-Image-Turbo_Sugar脸部Lora效果增强&#xff1a;ControlNetLora联合调控Sugar脸部结构 想生成那种又纯又欲、甜度爆表的Sugar风格脸部图片吗&#xff1f;是不是经常遇到模型生成的脸型不够精致、五官比例失调&#xff0c;或者风格不够统一的问题&#xff1f;今天&#xff0c…...

3步掌控数字记忆:WeChatMsg工具让你的聊天记录不再流浪

3步掌控数字记忆&#xff1a;WeChatMsg工具让你的聊天记录不再流浪 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...

手把手教你配置Davinci NvM Block:从Fee关联到Dataset索引的保姆级避坑指南

手把手教你配置Davinci NvM Block&#xff1a;从Fee关联到Dataset索引的保姆级避坑指南 在汽车电子软件开发中&#xff0c;非易失性存储管理&#xff08;NvM&#xff09;是确保关键数据持久化的核心模块。Davinci配置工具作为AUTOSAR开发环境的重要组成部分&#xff0c;其NvM B…...

MediaPipeUnityPlugin技术解构与实战指南:Unity AI视觉开发进阶之路

MediaPipeUnityPlugin技术解构与实战指南&#xff1a;Unity AI视觉开发进阶之路 【免费下载链接】MediaPipeUnityPlugin Unity plugin to run MediaPipe 项目地址: https://gitcode.com/gh_mirrors/me/MediaPipeUnityPlugin 问题发现&#xff1a;Unity AI视觉开发的现实…...

保姆级教程:深求·墨鉴Podman部署全流程,小白也能轻松搞定

保姆级教程&#xff1a;深求墨鉴Podman部署全流程&#xff0c;小白也能轻松搞定 1. 为什么选择Podman部署深求墨鉴&#xff1f; 传统Docker部署方式虽然常见&#xff0c;但对于深求墨鉴这样的轻量级OCR工具来说&#xff0c;Podman提供了更优雅的解决方案。Podman是一款无需守…...

AI系统-23AI芯片CPU子系统介绍

AI SoC中有很多异构核&#xff0c;围绕着这些异构核产生了很多子系统之前也介绍过:AI系统-16AI SoC推理芯片架构介绍。 这里面的老大哥毫无疑问就是CPU子系统&#xff0c;尽管其他AI子系统特别是NPU&#xff0c;是干活的主力&#xff0c;但是头把交椅还得资格最老的CPU来坐&am…...

nlp_structbert_sentence-similarity_chinese-large一键部署教程:Python环境快速配置指南

nlp_structbert_sentence-similarity_chinese-large一键部署教程&#xff1a;Python环境快速配置指南 想快速上手一个强大的中文文本相似度计算模型吗&#xff1f;今天咱们就来聊聊怎么在星图GPU平台上&#xff0c;用最简单的方式把 nlp_structbert_sentence-similarity_chine…...

GME-Qwen2-VL-2B-Instruct部署详解:CUDA版本兼容性与FP16加载验证

GME-Qwen2-VL-2B-Instruct部署详解&#xff1a;CUDA版本兼容性与FP16加载验证 1. 项目概述 GME-Qwen2-VL-2B-Instruct是一个专为图文匹配度计算优化的多模态模型工具。它解决了原生调用中常见的打分不准问题&#xff0c;通过本地化部署实现了高效、安全的图文检索功能。 1.1…...

WinForm实战:OxyPlot图表控件鼠标悬停显示坐标值(附完整代码)

WinForm实战&#xff1a;OxyPlot图表控件鼠标悬停显示坐标值&#xff08;附完整代码&#xff09; 在数据可视化应用中&#xff0c;实时交互功能往往能显著提升用户体验。当开发者需要在WinForm平台快速实现专业级图表时&#xff0c;OxyPlot.WindowsForms.Plot控件凭借其轻量级和…...

四旋翼无人机PID控制实战:从零搭建Matlab仿真模型(附完整代码)

四旋翼无人机PID控制实战&#xff1a;从零搭建Matlab仿真模型&#xff08;附完整代码&#xff09; 当第一次看到四旋翼无人机在空中灵活翻转、精准悬停时&#xff0c;很多人都会被这种看似违反物理直觉的飞行姿态所震撼。作为现代控制理论最生动的应用场景之一&#xff0c;无人…...