【C++】详解std::thread

这篇具有很好参考价值的文章主要介绍了【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;
}

【C++】详解std::thread,# C++多线程,c++,开发语言

这里的“terminate called without an active exception”暂时不用管

terminate called without an active exception是什么?

"terminate called without an active exception"是一个C++程序运行时可能遇到的异常信息。

它表示程序在没有活动异常的情况下被终止了。

这个异常通常发生在以下情况下:

  1. 程序主动调用了std::terminate()函数来终止程序的执行。这可能是因为程序遇到了无法处理的错误或异常情况。
  2. 程序由于未捕获的异常而终止。当程序抛出一个未捕获的异常时,如果没有其他活动的异常,系统会调用std::terminate()来终止程序。
  3. 程序由于某些特定的终止条件而被操作系统或其他外部因素终止。例如,操作系统可能会根据内存使用情况或其他资源限制来终止程序。

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;
}

【C++】详解std::thread,# C++多线程,c++,开发语言

可以看到线程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;
  else
	std::cout<<"joinable: false"<<std::endl;
  return 0;
}

【C++】详解std::thread,# C++多线程,c++,开发语言

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;
  else
	std::cout<<"joinable: false"<<std::endl;
  t1.join();
  return 0;
}

【C++】详解std::thread,# C++多线程,c++,开发语言

值得注意的是,没有了“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;
}

【C++】详解std::thread,# C++多线程,c++,开发语言

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);  // 创建线程1
    std::thread t2(threadFunction2);  // 创建线程2

    t1.swap(t2);  // 交换线程1和线程2的状态

    t1.join();  // 等待线程1结束
    t2.join();  // 等待线程2结束

    return 0;
}

【C++】详解std::thread,# C++多线程,c++,开发语言

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;
}

【C++】详解std::thread,# C++多线程,c++,开发语言

可以看到我的最大并行线程数是8,这是由我电脑的CPU决定的。文章来源地址https://www.toymoban.com/news/detail-705878.html

到了这里,关于【C++】详解std::thread的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【多线程】Thread 类 详解

    继承 Thread 来创建一个线程类,并重写 run() 方法 创建 MyThread 类的实例 调用 start 方法启动线程 注意:只有调用 start 函数才真正的创建了一个线程。 更推荐使用这种方法, 因为 Runnable 只是描述了一个任务,至于任务通过进程、线程、线程池还是什么来执行的,Runnable 并不关

    2024年02月09日
    浏览(44)
  • Java 线程池(Thread Pools)详解

    目录 1、线程池介绍 2、线程池执行原理 3、线程池中的阻塞队列 4、Java 线程池中的拒绝策略 5、Java 提供的创建线程池的方式 6、线程池的使用示例 7、ForkJoinPool 和 ThreadPool 的区别 1、线程池介绍          线程池是一种重用线程的机制 ,用于提高线程的利用率和管理线程的

    2024年02月05日
    浏览(40)
  • 多线程系列(二) -Thread类使用详解

    在之前的文章中,我们简单的介绍了线程诞生的意义和基本概念,采用多线程的编程方式,能充分利用 CPU 资源,显著的提升程序的执行效率。 其中 java.lang.Thread 是 Java 实现多线程编程最核心的类,学习 Thread 类中的方法,是学习多线程的第一步。 下面我们就一起来看看,创

    2024年02月19日
    浏览(43)
  • c++ 多线程: this_thread的使用

    在 C++11 中不仅添加了线程类,还添加了一个关于线程的命名空间 std::this_thread,在这个命名空间中提供了 四个公共的成员函数 ,通过这些成员函数就可以对当前线程进行相关的操作了 调用命名空间 std::this_thread 中的 get_id() 方法可以得到 当前 线程的 线程 ID ,函数原型如下

    2024年02月11日
    浏览(34)
  • 【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]

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

    2024年02月04日
    浏览(41)
  • 【.NET Core】 多线程之(Thread)详解

    线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及复杂且耗时的操作,那么设置不同的线程执行路径往往事半功倍,让每个线程执行特定的工作任务。 线程是一个 轻量级进程 。一个使用线程的常见实例是操作系统中并行编程的实现

    2024年01月20日
    浏览(38)
  • C++之C++11 thread线程示例(一百三十八)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2023年04月15日
    浏览(45)
  • C++ std::tie函数详解

    C++中std::tie函数的作用就是从元素引用中生成一个tuple元组,其在头文件tuple中定义,其函数原型如下: 其中参数 args 为构造 tuple 所用的零或更多左值参数。其返回值为含左值引用的std::tuple对象。 1. 解包 tuple 和 pair std::tie 可以用于解包 tuple 和 pair,因为 std::tuple 拥有从 pai

    2024年02月05日
    浏览(37)
  • 【Java系列】详解多线程(二)——Thread类及常见方法(下篇)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区交流讨论💌 在操作系统中创建线程时,通常会同时创建相应的PCB并将其

    2024年02月04日
    浏览(38)
  • 【Java系列】详解多线程(二)——Thread类及常见方法(上篇)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区交流讨论💌 我们先来回顾一下线程与进程之间的联系。 我们知道多进程

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包