【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;  // 输出truet.join();  // 等待新线程结束std::cout << "Is thread joinable? " << t.joinable() << std::endl;  // 输出falsereturn 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++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

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

相关文章

LeetCode Hot100 25.K个一组翻转链表

题目&#xff1a; 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯…

7+m6A+分型+实验,甲基化方向的生信思路,没有思路的同学可参考

今天给同学们分享一篇生信文章“Landscape analysis of m6A modification regulators related biological functions and immune characteristics in myasthenia gravis”&#xff0c;这篇文章发表在J Transl Med期刊上&#xff0c;影响因子为7.4。 结果解读&#xff1a; MG相…

快速文件搜索软件 Everything-voidtools

Everything 文件搜索软件 "Everything"是一款快速、轻巧且高效的桌面搜索引擎软件&#xff0c;专门用于在 Windows 操作系统上搜索文件和文件夹。它的主要特点是超快的搜索速度和精准的搜索结果&#xff0c;能够让用户快速找到他们需要的文件或文件夹。 1. 快速搜…

IDEA小技巧

目录 1. IDEA自动添加注释 创建类的时候自动添加注释 创建函数、方法的注释 1. IDEA自动添加注释 参考文档&#xff1a;idea java 自动添加文件注释 idea新建类自动注释_mob6454cc73c728的技术博客_51CTO博客 【操作工具】IDEA创建类及已有类添加注释-详细操作_idea设置创建…

搭建个人智能家居 开篇(搭建Home Assistant)

搭建个人智能家居 开篇&#xff08;搭建Home Assistant&#xff09; 前言Home Assistant搭建Home AssistantUbuntu系统搭建Windows系统搭建VM安装方法VirtualBox安装方法&#xff1a; 配置Home Assistant控制页面 前言 随着科技的进步、发展&#xff0c;物联网给我们的生活带来…

JdbcTemplate query系列方法指定jdbcType类型

使用SqlParameterValue类包装一下就行了&#xff0c;只要创建一个SqlParameterValue对象&#xff0c;通过构造函数把jdbcType类型&#xff08;用的是Types中的常量&#xff09;和值传入 例如&#xff1a; // 这两个包下面的 import org.springframework.jdbc.core.SqlParamete…

c YUV 转 JPEG(准备霍夫曼编码)

先取yuv 文件中一个168的块&#xff0c;跑通全流程 理解与思路&#xff1a; 1.块分割 YUV 文件分为&#xff1a;YUV444 YUV 422 YUV420。444:就是&#xff1a;12个char 有4个Y&#xff0c;4个U&#xff0c;4个 U&#xff0c;422&#xff1a;8个char 中有4个Y &#x…

Redis——01,服务器购买、安装Redis

服务器购买、安装Redis 一、随便去一个主流的国内主流的云服务提供商&#xff0c;购买一个服务器。二、Redis安装&#xff1a;————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢…

[论文阅读]Multimodal Virtual Point 3D Detection

Multimodal Virtual Point 3D Detection 多模态虚拟点3D检测 论文网址&#xff1a;MVP 论文代码&#xff1a;MVP 论文简读 方法MVP方法的核心思想是将RGB图像中的2D检测结果转换为虚拟的3D点&#xff0c;并将这些虚拟点与原始的Lidar点云合并。具体步骤如下&#xff1a; (1)…

VINS-MONO代码解读6----pose_graph

开始pose_graph部分&#xff0c;本部分记住一句话无论是快速重定位还是正常重定位&#xff0c;求出 T w 1 w 2 T_{w_1w_2} Tw1​w2​​就是终极目标。 还剩一个整体Pipeline~~ 1. pose_graph_node.cpp 注意&#xff0c;定义全局变量时即实例化了一个对象 PoseGraph posegra…

C++之模板

目录 泛型编程 模板 函数模板 函数模板的实例化 隐式实例化 显示实例化 类模板 我们知道STL&#xff08;标准模板库&#xff09;是C学习的精华所在&#xff0c;在学习STL之前我们得先学习一个新的知识点-------模板。那么模板究竟是什么呢&#xff1f;围绕着这个问题&a…

绘图示例---QT手动调用绘图事件,按钮控制图片

效果&#xff1a; 点击 “移动” 图片向右移动20&#xff0c;点击 “西理win嘛” 图片每秒向右移动20 QQ录屏20231212164128 下面时代码详解&#xff1a; 注意使用UI和代码实现按钮的不同 UI: ui->pushButton->setGeometry(windowWidth-105, windowHeight-25, 100, 20);…

【思考】只有实对称矩阵才能正交对角化吗?【矩阵的合同】

1&#xff1a;命题改写&#xff08;A可以正交对角化&#xff09; 2&#xff1a;左乘Q右乘Q逆&#xff08;Q转置&#xff09; 3&#xff1a;取转置 4&#xff1a;得证 总结 可以看到&#xff0c;矩阵如果可以正交对角化&#xff0c;那么一定是实对称矩阵。 另外&#xff0c;这…

【期末复习向】长江后浪推前浪之ChatGPT概述

参考文章&#xff1a;GPT系列模型技术路径演进-CSDN博客 这篇文章讲了之前称霸NLP领域的预训练模型bert&#xff0c;它是基于预训练理念&#xff0c;采用完形填空和下一句预测任务2个预训练任务完成特征的提取。当时很多的特定领域的NLP任务&#xff08;如情感分类&#xff0c…

LLM之Agent(六)| 使用AutoGen、LangChian、RAG以及函数调用构建超级对话系统

本文我们将尝试AutoGen集成函数调用功能。函数调用最早出现在Open AI API中&#xff0c;它允许用户调用外部API来增强系统的整体功能和效率。例如&#xff0c;在对话过程中根据需要调用天气API。 函数调用和Agent有各种组合&#xff0c;在这里我们将通过函数调用调用RAG检索增强…

【SpringBoot】配置文件

配置文件官网 1. 配置方式 application.propertiesapplication.yml / application.yaml 2. 自定义配置信息 将实体类中的本应该写死的信息写在属性配置文件中。 可以使用 Value("${键名}") 获取&#xff0c;也可以使用 ConfigurationProperties(prefix"前…

访谈型软文写作方式,媒介盒子告诉你

访谈型软文一般用于维护企业形象&#xff0c;分享品牌故事。但是许多企业在写访谈型软文时经常容易跑偏或者写来写去没有逻辑&#xff0c;今天媒介盒子就来和大家分享访谈型软文的写作方式&#xff0c;看完这四点&#xff0c;小白也能写好访谈型软文&#xff01; 一、 访谈对象…

C++_构造函数与析构函数

目录 1、构造函数的写法 1.2 构造函数优化写法 2、默认构造函数与默认成员函数 2.1 默认成员函数对不同类型的处理 3、对内置类型的补丁 4、析构函数 4.1 析构函数的写法 5、默认析构函数 6、初始化列表 6.1 初始化列表的写法 6.2 初始化列表的作用 6.3 回顾与总结 …

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

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

flutter的SingleChildScrollView控件详解

文章目录 SingleChildScrollView的介绍和使用场景详细介绍 SingleChildScrollView的介绍和使用场景 SingleChildScrollView 是 Flutter 中的一个小部件&#xff0c;用于创建一个可滚动的单个子部件。它通常用于处理内容超出屏幕可见区域的情况&#xff0c;允许用户通过滚动来查…