【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…...
别再死记硬背了!用Wireshark抓包实战,5分钟搞懂IP报文每个字段
用Wireshark解密IP协议:从抓包实战到网络诊断的完全指南 当你第一次打开网络教材看到IP报文那密密麻麻的字段时,是否感觉像在解读外星密码?传统的学习方法让我们死记硬背"版本号4位、首部长度4位、服务类型8位...",但今…...
5个简单步骤:在Windows电脑上直接安装Android应用的终极指南
5个简单步骤:在Windows电脑上直接安装Android应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否厌倦了在Windows电脑上使用Android模拟器…...
告别转矩脉动:用Matlab/Simulink手把手搭建三电平SVPWM异步电机DTC仿真模型
三电平SVPWM异步电机DTC仿真:从零搭建到性能优化的Matlab实战指南 在电机控制领域,直接转矩控制(DTC)因其结构简单、动态响应快等优势,已成为交流调速系统的重要技术路线。然而传统两电平DTC系统存在的转矩脉动大、电流谐波高等问题ÿ…...
Windows XP图标主题完整指南:轻松为Linux桌面注入经典怀旧风格
Windows XP图标主题完整指南:轻松为Linux桌面注入经典怀旧风格 【免费下载链接】Windows-XP Remake of classic YlmfOS theme with some mods for icons to scale right 项目地址: https://gitcode.com/gh_mirrors/win/Windows-XP 还在怀念Windows XP那个经典…...
【最新版】heic格式转换器下载教程 livp格式转jpg超详细图文转换教程
文章目录准备工作安卓手机拍摄的heic格式转jpg教程苹果heic格式转jpg专用工具livp格式转jpg教程heic格式文件无法打开的原因及解决方法heic转换jpg后文件变大是什么原因本文将详细教你实现heic格式转jpg与livp格式转jpg的操作方法,同时免费提供实用的heic格式转换器…...
超声引导手术中的‘呼吸’难题:我们如何用体外标记法搞定肝部超声-CT的实时配准?
超声与CT影像实时配准:破解呼吸运动干扰的临床实战方案 在肝癌射频消融或穿刺活检手术中,影像引导的精准度直接决定治疗效果。超声凭借其实时性成为首选引导工具,但图像质量局限常需与高分辨率的CT影像融合。这一过程中,呼吸运动导…...
RustClaw:高性能网络代理的Rust实现与架构解析
1. 项目概述:一个Rust实现的Claw库最近在折腾一些网络代理和流量处理的工具链,发现很多核心组件对性能和安全性的要求越来越高。传统的C/C实现虽然快,但内存安全和并发模型上的坑,让开发和维护成本居高不下。就在这个当口…...
CodeSandbox终极指南:10个让你开发效率倍增的隐藏功能
CodeSandbox终极指南:10个让你开发效率倍增的隐藏功能 【免费下载链接】codesandbox-client An online IDE for rapid web development 项目地址: https://gitcode.com/gh_mirrors/co/codesandbox-client CodeSandbox是一款强大的在线IDE,专为快速…...
三星48层3D V-NAND深度拆解:从电荷陷阱架构到存储密度革命
1. 初探三星48层3D V-NAND:一次深度拆解与工艺解析作为一名长期关注半导体存储技术的从业者,每次拿到业界巨头的新品进行物理层面的拆解分析,都像是一次充满惊喜的“寻宝”之旅。2016年初,当三星将其早在2015年8月就已预告的256Gb…...
Degrees of Lewdity中文本地化技术解析:从安装到优化的实践指南
Degrees of Lewdity中文本地化技术解析:从安装到优化的实践指南 Degrees of Lewdity作为一款备受欢迎的游戏,其英文界面一直是中文用户体验的主要障碍。本文提供的Degrees of Lewdity中文本地化技术解析,将系统指导您完成游戏汉化的全过程&a…...
