【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]

在这里插入图片描述

阅读导航

  • 引言
  • 一、thread类的简单介绍
  • 二、线程函数详细介绍
    • 1. start() 函数
      • (1)头文件
      • (2)函数原型
    • 2. join() 函数
      • (1)头文件
      • (2)函数原型
    • 3. detach() 函数
      • (1)头文件
      • (2)函数原型
      • (3)使用示例
    • 4. get_id() 函数
      • (1)头文件
      • (2)函数原型
      • (3)使用示例
    • 5. joinable() 函数
      • (1)头文件
      • (2)函数原型
      • (3)参数解释
      • (4)返回值
      • (5)使用示例
  • 三、std::this_thread命名空间
  • 温馨提示

引言

当讨论现代编程语言的特性时,C++11无疑是一个不容忽视的里程碑。在前一篇文章中,我们深入探讨了Lambda表达式在C++11中的引入和应用。本文将继续探索C++11的强大功能,具体而言,我们这篇文章将聚焦于线程库和其中的thread类。

线程在多任务处理中起着至关重要的作用,它们允许程序同时执行多个任务,从而提高效率和响应速度。在C++11之前,线程的处理相对复杂且容易出错。然而,在C++11中引入的thread类为我们带来了更加便捷和安全的线程管理方式。让我们一起深入研究C++11线程库中的thread类,探索多线程编程的无限潜力吧!

一、thread类的简单介绍

thread的官方文档
在这里插入图片描述

thread类是C++11引入的一个重要特性,它位于<thread>头文件中,并提供了一种简单而强大的方式来实现多线程编程。

使用thread类,我们可以轻松地创建和管理线程。通过创建thread对象,我们可以指定要执行的线程函数,并传递所需的参数。一旦线程对象被创建,我们可以使用它的成员函数来控制线程的生命周期,如启动线程、等待线程完成、检查线程是否运行等。

⭕以下是thread类的一些常用成员函数:

函数名功能
构造函数用于创建线程对象,并指定要执行的函数或可调用对象。
start()启动线程的执行,使线程进入就绪状态并开始运行。
join()阻塞当前线程,直到被调用的线程执行完毕。通常用于等待线程的结束,并获取线程的返回值(如果有)。
detach()将线程对象设置为分离状态,使得线程无法被其他线程join(),并在执行完毕后自动释放资源。
get_id()返回线程的ID,用于唯一标识一个线程。
joinable()查询线程是否可执行,即查询线程是否已经启动但未被join()。
hardware_concurrency()返回当前系统支持的最大线程数,通常与CPU核心数相同。

🚨注意:以上仅列举了thread类的部分常用成员函数,还有其他一些成员函数和静态成员函数可供我们使用。同时,在使用这些成员函数时,我们需要注意线程安全性和同步机制,以避免出现竞态条件和数据不一致的问题

二、线程函数详细介绍

1. start() 函数

start()函数通常是由线程对象调用的,用于开始执行一个新线程。

(1)头文件

start()函数在C++标准库的<thread>头文件中进行声明。

(2)函数原型

start()函数的函数原型如下:

void start();

2. join() 函数

在C++标准库中,std::thread类提供了join()函数用于等待一个线程的结束并回收资源。

(1)头文件

join()函数在C++标准库的<thread>头文件中进行声明。

(2)函数原型

join()函数的函数原型如下:

void join();

3. detach() 函数

detach()函数是std::thread类提供的一个成员函数,用于将线程与std::thread对象分离,使其成为一个独立的线程,并在后台运行。

(1)头文件

detach()函数在C++标准库的<thread>头文件中进行声明。

(2)函数原型

detach()函数的函数原型如下:

void detach();

(3)使用示例

下面是一个使用std::thread及其detach()函数的示例:

#include <iostream>
#include <thread>

void thread_func()
{
    std::cout << "Hello from new thread!" << std::endl;
}

int main()
{
    std::thread t(thread_func);  // 创建一个新线程,并指定线程函数
    t.detach();  // 分离新线程
    std::cout << "Hello from main thread!" << std::endl;
    return 0;
}

在上述示例中,我们首先创建一个std::thread对象t,并将一个线程函数thread_func作为参数传递给构造函数。然后,我们通过调用t.detach()函数将新线程与std::thread对象分离。最后,主线程输出“Hello from main thread!”。

在运行上述示例时,将会看到如下输出:

Hello from main thread!
Hello from new thread!

由于我们在主线程中调用了t.detach()函数,新线程成为一个独立的线程,并在后台运行。因此,在输出“Hello from main thread!”之后,新线程才会输出“Hello from new thread!”。

4. get_id() 函数

get_id()函数是std::thread类提供的一个成员函数,用于获取与std::thread对象相关联的线程的ID。

(1)头文件

get_id()函数在C++标准库的<thread>头文件中进行声明。

(2)函数原型

get_id()函数的函数原型如下:

std::thread::id get_id() const noexcept;

(3)使用示例

下面是一个使用std::thread及其get_id()函数的示例:

#include <iostream>
#include <thread>

void thread_func()
{
    std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}

int main()
{
    std::thread t(thread_func);  // 创建一个新线程,并指定线程函数
    std::cout << "Main thread ID: " << std::this_thread::get_id() << std::endl;
    t.join();  // 等待新线程结束
    return 0;
}

在上述示例中,我们首先创建一个std::thread对象t,并将一个线程函数thread_func作为参数传递给构造函数。然后,我们通过调用t.join()函数等待新线程结束。在新线程的线程函数中,我们输出线程的ID。在主线程中,我们也输出主线程的ID。

在运行上述示例时,将会看到如下输出:

Main thread ID: 140102324408064
Thread ID: 140102234146560

由于我们在主线程中调用了std::this_thread::get_id()函数和新线程中的get_id()函数,分别获取了主线程和新线程的ID。可以看到,两个线程的ID是不同的。

5. joinable() 函数

joinable()函数是std::thread类提供的一个成员函数,用于检查与std::thread对象关联的线程是否可以被join或detach。

(1)头文件

joinable()函数在C++标准库的<thread>头文件中进行声明。

(2)函数原型

joinable()函数的函数原型如下:

bool joinable() const noexcept;

(3)参数解释

joinable()函数没有参数。调用该函数时,将返回一个bool类型的值,表示与std::thread对象相关联的线程是否可以被join或detach。

(4)返回值

joinable()函数返回值类型为bool。如果与std::thread对象相关联的线程可以被join或detach,则返回true;否则返回false。

(5)使用示例

下面是一个使用std::thread及其joinable()函数的示例:

#include <iostream>
#include <thread>

void thread_func()
{
    std::cout << "Hello from new thread!" << std::endl;
}

int main()
{
    std::thread t(thread_func);  // 创建一个新线程,并指定线程函数
    std::cout << "Is thread joinable? " << t.joinable() << std::endl;  // 输出true
    t.join();  // 等待新线程结束
    std::cout << "Is thread joinable? " << t.joinable() << std::endl;  // 输出false
    return 0;
}

在上述示例中,我们首先创建一个std::thread对象t,并将一个线程函数thread_func作为参数传递给构造函数。然后,我们通过调用t.joinable()函数检查与std::thread对象关联的线程是否可以被joindetach。在新线程结束之前,该函数返回true。在调用t.join()函数等待新线程结束后,该函数返回false。

三、std::this_thread命名空间

C++11引入了std::this_thread命名空间,其中包含了一些与当前线程相关的函数和属性。这些函数和属性以全局函数或静态成员函数的形式提供。

⭕以下是std::this_thread命名空间下的一些常用函数:

函数名功能
std::this_thread::get_id()获取当前线程的ID,返回一个std::thread::id对象。
std::this_thread::sleep_for()使当前线程休眠一段指定的时间。接受一个std::chrono::duration作为参数,表示休眠的时间间隔。
std::this_thread::yield()暂时放弃当前线程的执行,允许其他线程运行。调用yield()后,当前线程可能会被重新调度执行,也可能继续让其他线程执行。

🚨注意:这些函数是与当前线程直接相关的,而不是用于创建或管理线程的类。

温馨提示

感谢您对博主文章的关注与支持!另外,我计划在未来的更新中持续探讨与本文相关的内容,会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

扫描电镜中的信号-噪声比(SNR)参数如何优化

在扫描电镜&#xff08;SEM&#xff09;中&#xff0c;信号-噪声比&#xff08;SNR&#xff09;的优化对于获得高质量的图像和可靠的数据分析至关重要。以下是一些优化SNR的方法&#xff1a; 选择适当的检测器&#xff1a;SEM通常配备了不同类型的检测器&#xff0c;如二次电子…

紫光展锐T820与飞桨完成I级兼容性测试 助推端侧AI融合创新

近日&#xff0c;紫光展锐高性能5G SoC T820与百度飞桨完成I级兼容性测试&#xff08;基于Paddle Lite工具&#xff09;。测试结果显示&#xff0c;双方兼容性表现良好&#xff0c;整体运行稳定。这是紫光展锐加入百度“硬件生态共创计划”后的阶段性成果。 本次I级兼容性测试完…

多域名https证书购买选择

多域名https证书是一种特殊的SSL证书&#xff0c;它允许一个证书同时保护多个域名&#xff0c;并且不限制域名的类型&#xff0c;可以保护多个域名和子域名&#xff0c;确保网站传输信息时不被窃取、篡改。那么我们该怎么选择符合需求的多域名https证书呢&#xff1f;今天就随S…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型&#xff0c;使用Kaggle开源数据集&#xff0c;旨在提取图片中的用户特征&#xff0c;最终在移…

vue3 使用antd 报错Uncaught TypeError--【已解决】

问题现象 使用最基本的 ant-design-vue 按钮demo 都报错 报错文字如下 Uncaught TypeError: Cannot read properties of undefined (reading value)at ReactiveEffect.fn (ant-design-vue.js?v597f5366:6693:87)at ReactiveEffect.run (chunk-K2VKR2AM.js?v25c381c3:461:…

计算三叉搜索树的高度 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 定义构造三又搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于节点的数加…

网络(九)CanSM及达芬奇配置

【小猫爪】AUTOSAR学习笔记05-Communication Stack之CanSM模块-CSDN博客 上链接讲的非常好。 CanSM提供的函数。 C CanSM使用的函数&#xff1a;

当你打开终端并输入命令时会发生什么?(下)

哈喽大家好&#xff0c;我是咸鱼 我们先来大致回顾一下文章《当你打开终端并输入命令时会发生什么?&#xff08;上&#xff09;》的内容 终端设备是由电传打字机演变过来的&#xff0c;电传打字机通过物理线与大型计算机连接在一块来实现输入输出 如上图&#xff0c;分别是二…

【高效开发工具系列】DataGrip入门

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针&#xff08;非函数指针&#xff09;&#xff1a; 有类型的函数指针&#xff1a; void 类型的指针&#xff1a; 结语 前言 进行单元测试之后&#xff0c;但凡…

【Proteus仿真】【51单片机】电子门铃设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;按键、无源蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管默认显示第一种门铃音调&#xff0c;可通过K1键切…

对不起,必须放弃SQL!

尽管SQL很受欢迎&#xff0c;也很成功&#xff0c;但它又总是充斥着种种矛盾。 SQL可能笨拙又冗长&#xff0c;但开发人员又经常发现它往往是他们提取所需数据的最简单直接的方法。当查询写入正确时&#xff0c;它可以快如闪电&#xff0c;当查询出错时&#xff0c;它就会慢如…

LeetCode(62)删除排序链表中的重复元素 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 删除排序链表中的重复元素 II 1.题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1…

像素、分辨率、频率、精度、延迟,关于光学动作捕捉镜头参数的那些事

精准度、分辨率、频率、延迟等参数是影响光学动作捕捉效果和还原度的关键因素。下面逐一介绍NOKOV度量动作捕捉系统的基础参数。 NOKOV度量动作捕捉系统的核心产品是光学动作捕捉镜头&#xff0c;用于捕捉被测物表面反光标记点的三维坐标数据。 从表中可以看到&#xff0c;不同…

Python自动化测试(unittest框架)

一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架&#xff0c;框架是一个半成品&#xff0c;框架是对常用的功能&#xff0c;基础的代码进行封装的一个工具&#xff0c;这个工具对外提供了一些API&#xff0c;其他的开发者只需要调用框架的接口即可&#xff…

Windows进程机制

进程 进程要做任何事情&#xff0c;必须让一个线程在它的上下文运行。该线程负责执行进程地址空间包含的代码。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候&#xff0c;会自动为进程创建第一个线程&#xff0c;这称为主线程&#xff08;…

word文档怎么压缩?超级好用!

当Word文档体积过大时&#xff0c;会遇到传输慢、无法上传等问题&#xff0c;这时候可以通过压缩软件、压缩图片等方式减小Word文档体积&#xff0c;下面就一起来看下具体的操作方法吧。 方法一&#xff1a;嗨格式压缩大师 嗨格式压缩大师是一个专业的压缩软件&#xff0c;可以…

分享10个国内免费的AI绘画工具

谈到 AI 绘画&#xff0c;许多人会联想到 Midjourney、Stable Diffusion、DALLE2 等国外的知名绘画工具。 然而&#xff0c;这些国外的 AI 绘画工具大部分都是付费的&#xff0c;并且需要借助科学上网才能使用。这两个条件让许多人望而却步。 考虑到很多人无法进行科学上网&a…

绿色视角下的高校校园建设及能耗管理

摘 要&#xff1a;2019年住建部发布了《绿色校园评价标准》(GB/T51356—2019)&#xff0c;将创建绿色校园提上了日程。绿色校园建设的目标是践行绿色发展理念&#xff0c;建立生态文明教育工作长效机制。创建绿色校园要从政府、社会、学校三个层面来实施&#xff0c;以加快高校…

【Spring Boot】Starter机制的使用及案例

一、引言 1、什么是SpringBoot Starter SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#xff0c;SpringBoot就能自动扫描到要加载的信息并启…