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 来进行多线程编程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity-授权示例

用户基于权限进行授权 定义用户与权限 authorities()。 package com.cms.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.User; import…

台式机通过网线直连笔记本,台式机通过笔记本上网【解决台式机没有网络的问题】

一、总览 将笔记本电脑和台式机使用网线连接起来。在笔记本电脑上打开网络和共享中心&#xff0c;进入“更改适配器设置”选项&#xff0c;找到当前连接的网卡&#xff0c;右键点击选择“属性”。在网卡属性中&#xff0c;找到“共享”选项卡&#xff0c;勾选“允许其他网络用…

CentOS 7Linux配置阿里源-2

要在Linux系统上配置阿里源&#xff0c;您可以按照以下步骤操作&#xff1a; 备份旧的软件源配置&#xff08;可选&#xff09;&#xff1a; 如果您想保留原始的软件源配置&#xff0c;可以先进行备份。例如&#xff0c;对于CentOS系统&#xff0c;您可以将/etc/yum.repos.d/Ce…

湖北大学2024年成人高考函授报名专升本法学专业介绍

湖北大学&#xff0c;这所承载着深厚文化底蕴和学术积淀的高等学府&#xff0c;始终致力于为广大有志之士提供多元化的学习机会。在时代的浪潮中&#xff0c;为了满足社会对于高层次法律人才的需求&#xff0c;湖北大学特别推出了成人高等继续教育项目&#xff0c;为广大在职人…

黄历工具网/万年历/财神方位/日历/佛历/道历/24节气/PHP网站源码

黄历工具网/万年历/财神方位/日历/佛历/道历/24节气/PHP网站源码 演示地址&#xff1a; https://hl.caohongji.com/ 手机端地址&#xff1a; https://mhl.caohongji.com/ 客服&#xff1a; kkmp326 源码说明&#xff1a; 1、系统内的黄历宜忌、农历、日历、佛历、道…

MySQL——聚合函数及分组过滤

聚合函数&#xff08;常用&#xff09; 函数名称描述COUNT()计数 SUM() 求和AVG()平均值MAX()最大值MIN()最小值...... -- 都能够统计表中的数据&#xff08;查询表中有多少个记录&#xff09; SELECT COUNT(studentname) FROM student -- COUNT(字段)&#xff0c;会忽略所有…

cpp类与对象(上2)

目录 封装 类的作用域 类的实例化 类对象模型 如何计算类对象的大小 类对象的存储方式 结构体内存对齐规则 this指针 this指针的特性 C语言和C实现Stack的对比 C实现 C实现 封装 面向对象的三大特性&#xff1a;封装、继承、多态。 封装&#xff1a;将数据和操作数据…

前端基础--Vue2

前端技术发展史(了解) 1.前端历史 1.1.静态网页 1990 html 1.2.异步刷新-操作dom 1995 javascript 1.3.动态网站 Asp/jsp&#xff08;java&#xff09;,php等&#xff0c;后台臃肿 1.4.Ajax成为主流 异步请求 1.5.Html5 被认为是互联网的核心技术之一。HTML产生于19…

Docker之jekins的安装

jekins官网地址&#xff1a;Jenkins Plugins &#xff08;https://plugins.jenkins.io/&#xff09; jekins 的docker 官方地址&#xff1a;https://hub.docker.com/r/jenkins/jenkins jekins 的docker 允许命令文档地址&#xff1a; docker/README.md at master jenkinsci…

Python图形编程-OpenGL开发环境搭建

OpenGL开发环境搭建 文章目录 OpenGL开发环境搭建1、安装依赖模块2、顶点数组对象 (VAO)3、顶点缓冲区 (VBO)4、着色器程序5、程序入口6、完整代码7、模型-视图-投影矩阵示例7.1 创建模型-视图-投影矩阵7.2 创建Uniform变量7.3 完整代码本文将详细介绍如何搭建基于Python的…

学分制系统 WebService_PantoSchool SQL注入致RCE漏洞复现

0x01 产品简介 学分制系统由上海鹏达计算机系统开发有限公司研发,是基于对职业教育特点和需求的深入理解,结合教育部相关文件精神,并广泛吸纳专家、学者意见而开发的一款综合性管理系统。系统采用模块化的设计方法,方便学校根据自身教学改革特点、信息化建设进程情况选择、…

Kubernetes之Scheduler详解

本文尝试从Kubernetes Scheduler的功能介绍、交互逻辑、伪代码实现、最佳实践、自定义Scheduler举例及其历史演进6个方面进行详细阐述。希望对您有所帮助&#xff01; 一、Kubernetes Scheduler 功能 Kubernetes Scheduler 是 Kubernetes 集群的核心组件之一&#xff0c;负责…

Qwen2本地web Demo

Qwen2的web搭建(streamlit) 千问2前段时间发布了&#xff0c;个人觉得千问系列是我用过最好的中文开源大模型&#xff0c;所以这里基于streamlit进行一个千问2的web搭建&#xff0c;来进行模型的测试 一、硬件要求 该文档中使用的千问模型为7B-Instruct&#xff0c;需要5g以…

高质量外链:提升网站权重的秘密武器

在当今的互联网世界中&#xff0c;网站优化已经成为许多企业和个人提升品牌影响力和扩大市场份额的重要手段。而在众多优化策略中&#xff0c;高质量外链无疑是提升网站权重、增加曝光度和流量的关键所在。 一、高质量外链的定义与重要性 高质量外链&#xff0c;即来自于权威…

ROT5、ROT13、ROT18、ROT47全系列加解密小程序

ROT5、ROT13、ROT18、ROT47全系列加解密小程序 这几天在看CTF相关的课程&#xff0c;涉及到古典密码学和近代密码学还有现代密码学。自己编了一个关于ROT全系列的加、解密小程序。 ​ ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性&a…

【铂电阻测温】如何保证热电阻采集的可靠性

TPS02RAH的输出接口为I2C&#xff0c;支持主机动态更改模块I2C地址&#xff0c;实现了单I2C总线挂载多个TPS02RAH测温模块的功能。 TPS02RAH的输出接口为I2C&#xff0c;支持主机动态更改模块I2C地址&#xff0c;实现了单I2C总线挂载多个TPS02RAH测温模块的功能。 参考链接 【…

SQL查询的执行流程

SQL查询的执行流程 ✨ 1、书写顺序和执行顺序✨ 2、SQL的执行流程✨ 3、WHERE与ON的使用 ✨ 1、书写顺序和执行顺序 查询是DBMS&#xff08;OLTP&#xff09;和OLAP中最常用的操作。我们在理解SELECT语法的时候&#xff0c;还需要了解SELECT执行时的底层原理。只有这样&#xf…

基于运动方程的多种滤波器仿真比较(KF\EKF\IMM\MC\IKF\UKF)

EKF_3.m KF_6.m kfilter.m MC.m trackAEKF.m trackEKF.m trackEKF_8.m trackEKF_Z5.m tracklMM.m trackKF.m trackUKF.m %-------------------

SquareLine Studio:快速创建美观的用户界面

文章目录 SquareLine Studio 简介1.1 什么是 SquareLine Studio1.2 目标用户群体 功能与服务2.1 拖放式 UI 编辑器2.2 订阅计划 下载与安装3.1 当前版本下载3.2 下载存档 保持更新4.1 订阅新闻通讯订阅流程新闻通讯内容订阅的好处 其他资源5.1 快速链接5.2 开发者服务 应用场景…

领夹麦克风什么样的好,麦克风品牌排行榜前十名,无线麦克风推荐

​在人人可做自媒体的时代&#xff0c;众多普通人加入自媒体。对拍视频的自媒体人&#xff0c;好内容是基础&#xff0c;好设备是保障。想提升视频音质需专业无线麦克风。现无线麦克风品牌多&#xff0c;如何少花钱买高性价比产品是问题。作为资深自媒体人&#xff0c;我用过的…