【C++】详解std::thread
2023年9月10日,周日下午开始
2023年9月10日,周日晚上23:35完成
虽然这篇博客我今天花了很多时间去写,但是我对std::thread有了一个完整的认识
不过有些内容还没完善,以后有空再更新....
目录
- 头文件
- 类的成员
- 类型
- 方法
- (constructor)
- terminate called without an active exception是什么?
- operation=
- get_id
- joinable
- join
- detach
- native_handle
- swap
- hardware_concurrency
头文件
#include<thread>
类的成员
类型
id 线程ID(公共成员类型)
native_handle_type 本地句柄类型(公共成员类型)
方法
(constructor) 构造线程(公共成员函数)
(destructor) 线程析构函数(公共成员函数)
operator= 移动赋值线程(公共成员函数)
get_id 获取线程ID(公共成员函数)
joinable 检查是否可加入(公共成员函数)
join 加入线程(公共成员函数)
detach 分离线程(公共成员函数)
swap 交换线程(公共成员函数)
native_handle 获取本地句柄(公共成员函数)
hardware_concurrency [static] 检测硬件并发性(公共静态成员函数)
(constructor)
该构造函数用来创建线程,并执行传入的函数
#include <iostream>
#include<thread>
void func()
{std::cout << "func executes!" << std::endl;
}int main()
{std::thread t1(func);return 0;
}

这里的“terminate called without an active exception”暂时不用管
terminate called without an active exception是什么?
"terminate called without an active exception"是一个C++程序运行时可能遇到的异常信息。
它表示程序在没有活动异常的情况下被终止了。
这个异常通常发生在以下情况下:
- 程序主动调用了
std::terminate()函数来终止程序的执行。这可能是因为程序遇到了无法处理的错误或异常情况。 - 程序由于未捕获的异常而终止。当程序抛出一个未捕获的异常时,如果没有其他活动的异常,系统会调用
std::terminate()来终止程序。 - 程序由于某些特定的终止条件而被操作系统或其他外部因素终止。例如,操作系统可能会根据内存使用情况或其他资源限制来终止程序。
operation=
在C++中,std::thread类提供了operator=运算符重载函数,用于将一个线程对象赋值给另一个线程对象。使用operator=可以将一个线程对象的控制转移到另一个线程对象,从而实现线程的交换或转移。这意味着调用operator=后,原线程对象将结束执行,而新线程对象将开始执行之前正在执行的代码。
get_id
该方法用来获取线程ID
#include <iostream>
#include<thread>
void func()
{std::cout <<"func executes!" << std::endl;
}int main()
{std::thread t1(func);std::cout<<"ID of thread t1 is "<<t1.get_id()<<std::endl;return 0;
}

可以看到线程ID为2
joinable
什么是join呢?join是什么意思?
在线程中,join指的是等待一个线程执行完毕并返回结果后再继续执行主线程。当主线程调用子线程的join方法时,主线程会阻塞并等待子线程执行完成。这样可以确保所有线程按照预期的顺序执行,并且最后的结果是正确的。
那不用join会发生什么事情呢?
主线程不会等待子线程完成,这样有可能子线程还没执行完主线程就结束了。
#include <iostream>
#include<thread>
void func()
{std::cout <<"func executes!" << std::endl;
}int main()
{std::thread t1(func);std::cout<<"ID of thread t1 is "<<t1.get_id()<<std::endl;if(t1.joinable())std::cout<<"joinable: ture"<<std::endl;elsestd::cout<<"joinable: false"<<std::endl;return 0;
}

join
上面已经说过,所以不再赘述
#include <iostream>
#include<thread>
void func()
{std::cout <<"func executes!" << std::endl;
}int main()
{std::thread t1(func);std::cout<<"ID of thread t1 is "<<t1.get_id()<<std::endl;if(t1.joinable())std::cout<<"joinable: ture"<<std::endl;elsestd::cout<<"joinable: false"<<std::endl;t1.join();return 0;
}

值得注意的是,没有了“terminate called without an active exception”
detach
什么是detach呢?detach是什么意思?
分离线程的主要目的是允许主线程在子线程执行一些耗时的操作时继续执行其他任务。通过分离线程,主线程可以避免被阻塞,从而提高程序的整体效率。
使用detach和不使用join有什么区别?
目前我还没搞懂....以后弄懂了再更新
#include <iostream>
#include<thread>
void func()
{for(int i=0;i<10000;i++){//让线程休眠1秒std::this_thread::sleep_for(std::chrono::seconds(1));std::cout <<"func executes!" << std::endl;}
}int main()
{std::thread t1(func);t1.detach();//让主线程给子线程足够的执行时间for(int i=0;i<10000;i++)std::this_thread::sleep_for(std::chrono::seconds(1);return 0;
}

native_handle
C++标准库中的native_handle是一个低级接口,可以获取底层操作系统的句柄(handle)。
native_handle主要用于一些需要直接与操作系统交互的低级场景。
swap
swap()函数的作用是将两个线程对象的控制转移到彼此,从而实现线程的交换。这意味着调用swap()后,两个线程将开始执行对方之前正在执行的代码。
#include <iostream>
#include <thread>void threadFunction1() {// 线程1的代码for(int i=0;i<10000;i++){//让线程休眠1秒std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "Thread 1 is running." << std::endl;}}void threadFunction2() {// 线程2的代码for(int i=0;i<10000;i++){//让线程休眠1秒std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "Thread 2 is running." << std::endl;}
}int main() {std::thread t1(threadFunction1); // 创建线程1std::thread t2(threadFunction2); // 创建线程2t1.swap(t2); // 交换线程1和线程2的状态t1.join(); // 等待线程1结束t2.join(); // 等待线程2结束return 0;
}

hardware_concurrency
在C++中,hardware_concurrency是一个用于确定系统上可用的处理器核心数量的函数。它返回一个整数值,表示可以并行执行的最大线程数。通常,hardware_concurrency()函数返回的值取决于底层操作系统和硬件平台。
#include <iostream>
#include <thread>int main() {unsigned int numThreads = std::thread::hardware_concurrency();std::cout << "Number of available processor cores: " << numThreads << std::endl;return 0;
}

可以看到我的最大并行线程数是8,这是由我电脑的CPU决定的。
相关文章:
【C++】详解std::thread
2023年9月10日,周日下午开始 2023年9月10日,周日晚上23:35完成 虽然这篇博客我今天花了很多时间去写,但是我对std::thread有了一个完整的认识 不过有些内容还没完善,以后有空再更新.... 目录 头文件类的成员类型方法(construc…...
Apache HTTPD 漏洞复现
文章目录 Apache HTTPD 漏洞复现1. Apache HTTPD 多后缀解析漏洞1.1 漏洞描述1.2 漏洞复现1.3 漏洞利用1.4 获取GetShell1.5 漏洞防御 2. Apache HTTPD 换行解析漏洞-CVE-2017-157152.1 漏洞描述2.2 漏洞复现2.3 漏洞利用2.4 修复建议 3. Apache HTTP Server_2.4.49 路径遍历和…...
【C++从入门到精通】第2篇:C++基础知识(中)
文章目录 2.1 iostream介绍:cout、cin和endl2.1.1 输入/输出库2.1.2 std::cout2.1.3 std::endl2.1.4 std::cout是缓冲的2.1.5 std::endl与\n2.1.6 std::cin2.1.7 总结2.1.8 练习时间 2.2 未初始化的变量和未定义的行为2.2.1 未初始化的变量2.2.2 未定义行为2.2.3 明…...
【RuoYi移动端】uni-app中实现生成二维码功能(代码示例)
完整示例: <template><view><view class"titleBar">执法检查“通行码”信息</view><view class"twoCode"><canvas canvas-id"qrcode"></canvas></view></view> </templat…...
深度解剖数据在栈中的应用
> 作者简介:დ旧言~,目前大一,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 望小伙伴们点赞👍收藏✨加关注哟💕…...
Android10 SystemUI系列 需求定制(一)状态栏控制中心默认tile定制属性适配
一、前言 SystemUI 所包含的界面和模块比较多,这一节主要分享一下控制中心默认tile 列表的实现,通过配置可以实现 下拉状态栏,控制中心默认的tile显示 二、准备工作 按照惯例先找一下控制中心的代码,主要在下面这个路径下 frameworks/base/packages/SystemUI/src/com/andr…...
【微信小程序】文章设置
设置基本字体样式:行高、首行缩进 font-size: 32rpx;line-height: 1.6em;text-indent: 2em;padding: 20rpx 0;border-bottom: 1px dashed var(--themColor); 两端对齐 text-align: justify; css文字两行或者几行显示省略号 css文字两行或者几行显示省略号_css…...
程序员在线周刊(冒泡算法篇)
大家好,欢迎来到程序员在线周刊!本期我们将深入探讨一种经典的排序算法——冒泡算法,并附上具体的代码实现。 目录 简介代码原理广告广告1广告2广告3 简介 冒泡算法是一种简单但效率较低的排序算法,它的原理非常直观:…...
string
目录 六、STL简介 (一)什么是STL (二)STL的版本 (三)STL六大组件 七、string (一)标准库中的string 1、string类 2、string常用的接口 1)string类对象的常见构造 2)string类对象的容量操作 3)string类对象的访问及遍历操作 4)string类对象的修改操作 5)string类非成…...
html的日期选择插件
1.效果 2.文档 https://layui.gitee.io/v2/docs/ 3.引入 官网地址: https://layui.gitee.io/v2/ 引入(在官网下载,)jquery-1.7.2.min.js,layui/layui.js **<link href"js/layui/css/layui.css" rel"stylesh…...
OPPO哲库事件 “ 始末 ” ! 集体打哑谜?
1►OPPO哲库解散 2019 年,美国商务部以“科技网络安全”为由,将华为公司及其70家附属公司列入出口管制“实体名单”。与此同时,OPPO 创始人兼 CEO陈明永对外宣布,公司将为未来三年内投入 500 亿元用于前沿技术和深水区技术的探索…...
数据聚类分析
K均值 1.1 数据来源(随机生成) import matplotlib.pyplot as plt from sklearn.datasets import make_blobsX, y make_blobs(n_samples150,n_features2,centers3,cluster_std0.5,shuffleTrue,random_state0) # plt.scatter(X[:, 0], X[:, 1], cwhite, markero, edgecolorsbl…...
前 40 个 Microsoft Excel 面试问题答案
1)什么是 Microsoft Excel? Microsoft Excel 是一个电子电子表格应用程序,使用户可以使用按行和列细分的电子表格系统,使用公式存储,组织,计算和处理数据。 它还提供了使用外部数据库进行分析,…...
ros2学习笔记:shell环境变量脚本setup.bash[-z][-n][-f]参数作用
-n作用 [ -n 字符串 ] or [ 字符串 ] 字符串的长度为非零(有内容)则为真。加-n与不加-n结果相同。 -z作用 [ -z 字符串 ] 字符串的长度为零则为真。 字符串为空即NULL时为真,与上面的-n相反。 -f作用 [ -f FILE ] 如果 FILE 存在且是一…...
xss渗透(跨站脚本攻击)
一、什么是XSS? XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。 这里我们主要注意四点: 1、目标网站目标用户; 2、浏览…...
9参数化重采样时频变换,基于MATLAB平台,程序已调通,可直接替换数据进行分析。
参数化重采样时频变换,基于MATLAB平台,程序已调通,可直接替换数据进行分析。 9matlab参数化重采样时频变换 (xiaohongshu.com)...
RK3568平台开发系列讲解(调试篇)系统运行相关频率设置
🚀返回专栏总目录 文章目录 一、CPU 频率设置二、DDR 频率设置三、NPU 频率设置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 CPU 默认是 interactive 状态,它会根据 CPU 使用率和目标负载来动态地调整 CPU 频率。为获得更高运行速度或者性能评估,我们需要手动固…...
嵌入式:驱动开发 Day2
作业:字符设备驱动,完成三盏LED灯的控制 驱动代码: mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include &q…...
RK3399平台开发系列讲解(入门篇)VIM的基础命令
🚀返回专栏总目录 文章目录 一、Vim 命令速查二、其他命令三、Vim模式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍Vim相关命令。 一、Vim 命令速查 简单说明一下,这张图上展示了一个键盘。图中的“•”表示,单个字母不是完整的命令,必须再有进一步…...
Rocky Linux 安装图解(替代centos)服务器+桌面
centos自从20年底转变为不稳定版本后,有很多替代方案 经过近3年的发展,rocky linux算是一个比较好的选择,一是依照red hat企业版来做,二是rocky的发起者也是centos的创始人 如果想安装debian,可以参考:deb…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
