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

C++11中std::thread的使用

C++11 引入了 std::thread,它是用于创建和管理线程的标准库类。以下是详细的讲解,包括如何使用 std::thread 进行线程创建、管理和参数传递等操作。

1. 包含必要的头文件

在使用 std::thread 前,需要包含 <thread> 头文件:

#include <thread>

2. 创建和启动线程

可以通过传递一个可调用对象(函数、lambda 表达式或函数对象)给 std::thread 的构造函数来创建和启动线程。

示例:使用函数
#include <iostream>
#include <thread>void printMessage(const std::string& message) {std::cout << message << std::endl;
}int main() {std::thread t(printMessage, "Hello from the thread!");t.join(); // 等待线程完成return 0;
}
示例:使用 lambda 表达式
#include <iostream>
#include <thread>int main() {std::thread t([]() {std::cout << "Hello from the lambda thread!" << std::endl;});t.join(); // 等待线程完成return 0;
}

3. 等待线程完成

使用 join 方法可以阻塞主线程,直到被 join 的线程执行完毕。

t.join();

4. 分离线程

使用 detach 方法可以将线程分离,分离后的线程在后台独立运行,直到执行完毕。

t.detach();

5. 传递参数给线程

可以通过构造函数传递参数给线程函数。

示例:传递多个参数
#include <iostream>
#include <thread>void printValues(int a, double b) {std::cout << "a = " << a << ", b = " << b << std::endl;
}int main() {std::thread t(printValues, 10, 3.14);t.join();return 0;
}

6. 使用 std::ref 传递引用参数

默认情况下,std::thread 会复制传递给它的参数。如果需要传递引用,可以使用 std::ref

示例:传递引用参数
#include <iostream>
#include <thread>
#include <functional> // std::refvoid printMessage(const std::string& message) {std::cout << message << std::endl;
}int main() {std::string message = "Hello from the reference thread!";std::thread t(printMessage, std::ref(message));t.join();return 0;
}

7. 检查线程是否可联结(joinable)

可以使用 joinable 方法检查线程是否可以 join。如果一个线程已经被 joindetach,那么它将不再是可联结的。

if (t.joinable()) {t.join();
}

8. 线程的异常处理

可以在线程函数中使用异常处理机制(如 try-catch 块)来捕获和处理异常。

示例:在线程中处理异常
#include <iostream>
#include <thread>void threadFunction() {try {throw std::runtime_error("An error occurred");} catch (const std::exception& e) {std::cerr << "Exception caught in thread: " << e.what() << std::endl;}
}int main() {std::thread t(threadFunction);t.join();return 0;
}

9. 线程的硬件并发性

可以使用 std::thread::hardware_concurrency 来获取系统支持的并发线程数。

unsigned int n = std::thread::hardware_concurrency();
std::cout << "Number of concurrent threads supported: " << n << std::endl;

10. 使用 std::asyncstd::future 管理异步任务

除了 std::thread,C++11 还引入了 std::asyncstd::future 来简化异步任务的管理。

示例:使用 std::async
#include <iostream>
#include <future>int compute() {return 42;
}int main() {std::future<int> result = std::async(compute);std::cout << "Result from async: " << result.get() << std::endl;return 0;
}

参考文献

  • C++ Reference
  • ISO C++ Foundation
  • Thread Management in C++11

通过以上步骤和示例,可以较全面地了解和使用 C++11 中的 std::thread 来进行多线程编程。

相关文章:

C++11中std::thread的使用

C11 引入了 std::thread&#xff0c;它是用于创建和管理线程的标准库类。以下是详细的讲解&#xff0c;包括如何使用 std::thread 进行线程创建、管理和参数传递等操作。 1. 包含必要的头文件 在使用 std::thread 前&#xff0c;需要包含 <thread> 头文件&#xff1a; …...

酷瓜云课堂(内网版)v1.1.5 发布,局域网在线学习+考试系统

更新内容 更新layui-v2.9.10更新docker国内镜像地址增加导入镜像构建容器的方式教师不批阅非首次考试试卷轮播图增加专栏类型目标链接增加课程能否发布检查去除初始化kindeditor语言文件去除选择题EF选项优化富文本内容显示样式优化内容图片点击放大监听优化试题题干答案等图片…...

大数据之Hadoop部署

文章目录 服务器规划服务器环境准备1. 网络测试2. 安装额外软件包3. 安装基础工具4. 关闭防火墙5. 创建用户并配置权限6. 创建目录并设置权限7. 卸载JDK8. 修改主机名9. 配置hosts文件10. 重启服务器 配置免密登录安装Java安装Hadoop1. Hadoop部署2. 配置Hadoop3. 格式化Hadoop…...

Java异常处理中的“throw”与“throws”的区别

在Java中&#xff0c;throw 和 throws 是两个用于处理异常的关键词&#xff0c;它们的使用场景和目的有所不同 1. throw throw 关键字用于在Java程序中显式地抛出一个异常。当你检测到某些条件&#xff08;通常是错误条件&#xff09;时&#xff0c;你可以使用 throw 来抛出一…...

英语智汇学习系统

目 录 1 软件概述 1.1 项目研究背景及意义 2 系统相关技术 2.1 HTML、WXSS、JAVASCRIPT技术 2.2 Vanilla框架 2.3 uni-app框架 2.4 MYSQL数据库 3 需求分析 3.1 可行性分析 3.2 功能需求分析 3.3 系统用户及用例分析 3.4 非功能需求分析 3.5 数据流图…...

ExtractAItoTEXT 提取Adobe illustrator AI文件中的文字到文本文件翻译并写回到Adobe illustrator AI文件

Extract Text from Adobe illustrator to text for translate and write back to Adobe illustrator after translate in text file. Originally script from marceloliaohotmail.com during his work in SDL. Updated by me. 从Adobe illustrator中提取文本以进行翻译&#x…...

ms17-010 ms12-020 ms-08-067

MS17-010是一个由微软发布的安全公告编号&#xff0c;它指代了一个严重级别的安全漏洞&#xff0c;该漏洞存在于Microsoft Windows的Server Message Block 1.0 (SMBv1)协议处理中。这个漏洞被命名为“永恒之蓝”&#xff08;EternalBlue&#xff09;&#xff0c;因为它最初是由…...

【海思Hi3403V100】多目拼接相机套板硬件规划方案

海思Hi3403V100 是专业超高清智能网络摄像头 SoC。该芯片最高支持四路 sensor 输入&#xff0c;支持最高 4K60fps 的 ISP 图像处理能力&#xff0c;支持 3F 、WDR、多级降噪、六轴防抖、硬件拼接、多光谱融合等多种传统图像增强和处理算法&#xff0c;支持通过AI 算法对输入图像…...

AI的赚钱风向,彻底变了!

从2023年3月起&#xff0c;生成式AI技术的浪潮席卷全球&#xff0c;让不少人开始焦虑中国AI技术与美国的差距。然而&#xff0c;最近的趋势显示&#xff0c;AI创业的盈利模式已经发生了根本性的变化。今年&#xff0c;我们见证了AIGC&#xff08;人工智能生成内容&#xff09;企…...

服务器重启后jenkins任务内容不见了,并且新建任务也不见了

服务器centos7.4 背景&#xff1a;服务器异常重启后&#xff0c;jenkins上面的任务只剩下一些前端项目&#xff0c;后端的任务都不展示了&#xff0c;jenkins版本是Jenkins 2.346.3 解决方案&#xff1a;根据显示&#xff0c;jenkins很多的插件引用失败&#xff0c;显示需要升…...

如何选择合适的WordPress主机?

选择合适的WordPress主机需要考虑多个因素&#xff0c;包括性能、速度、存储空间、带宽、硬件配置、操作系统、支持的软件版本以及安全性等。以下是一些详细的建议&#xff1a; 性能和速度&#xff1a;选择一个能够提供快速加载速度和稳定性能的主机至关重要。快速加载的网站不…...

面试突击:Java 集合知识体系梳理

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。在 Java 开发中&#xff0c;集合类对象绝对是被使用最频繁的对象之一。因此&#xff0c;深入了解集合类对象的底层数…...

AI智能管理系统设计文档

AI智能管理系统设计文档 1. 引言 本设计文档旨在开发一套全面的AI智能管理系统&#xff0c;以优化生产运营效率和决策质量。该系统将利用先进的AI技术和数据分析能力&#xff0c;提供自动化流程控制、预测性维护、智能决策支持等功能。 2. 需求分析与目标设定 2.1 业务需求…...

干涉阵型成图参数记录【robust】

robust 这个玩意经常忘记&#xff0c;就是取2的时候是更加显示大尺度的结构&#xff0c;取-2更加显示小尺度结果&#xff0c;一般取0就是正常就好了...

React Native工程运行时下载gradle超时问题

React Native工程在运行Android的时候会下载gradle&#xff0c;但是由于众所周知的问题&#xff0c;总是下载失败&#xff0c;这时可以通过修改 <APP_ROOT>/android/wrapper/gradle-wrapper.properties 文件中 distributionUrl 参数使用国内 gradle 镜像来提高下载速度。…...

本地离线模型搭建指南-LLaMA-Factory训练框架及工具

搭建一个本地中文大语言模型&#xff08;LLM&#xff09;涉及多个关键步骤&#xff0c;从选择模型底座&#xff0c;到运行机器和框架&#xff0c;再到具体的架构实现和训练方式。以下是一个详细的指南&#xff0c;帮助你从零开始构建和运行一个中文大语言模型。 本地离线模型搭…...

数智化金融采购系统特点

数智化金融采购系统是郑州信源公司结合众多金融行业采购特点&#xff0c;采用流程优化再造的理念&#xff0c;为银行、保险、证券、交易所等金额机构打造的细分行业产品&#xff0c;助力金融行业采购合规管理、风险防范、成本管理和效率提升。 系统特点 1、全业务覆盖&#x…...

使用 SwiftUI 为 macOS 创建类似于 App Store Connect 的选择器

文章目录 前言创建选择器组件使用选择器组件总结前言 最近,我一直在为我的应用开发一个全新的界面,它可以让你查看 TestFlight 上所有可用的构建,并允许你将它们添加到测试群组中。 作为这项工作的一部分,我需要创建一个组件,允许用户从特定构建中添加和删除测试群组。我…...

Python26 Lambda表达式

1.什么是lambda表达式 lambda 是 Python 中的一个关键字&#xff0c;用于定义简单的匿名函数。与 def 关键字定义的标准函数不同&#xff0c;lambda 函数主要用于需要一个函数对象作为参数的简短操作。lambda 函数的设计哲学是简洁&#xff0c;因此它只能包含一条表达式&#…...

2024年数据、自动化与智能计算国际学术会议(ICDAIC 2024)

全称&#xff1a;2024年数据、自动化与智能计算国际学术会议&#xff08;ICDAIC 2024&#xff09; 会议网址:http://www.icdaic.com 会议地点: 厦门 投稿邮箱&#xff1a;icdaicsub-conf.com投稿标题&#xff1a;ArticleTEL。投稿时请在邮件正文备注&#xff1a;学生投稿&#…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...