std::jthread与std::thread区别

​std::jthread是C++20新引入的线程类,与 std::thread 类似,或者说,jthread是对thread进一步的封装,功能更强大​。

​std::jthread的​j实际上是​joining的缩写​,​众所周知,std::thread在其生命周期结束时调用join()(让主线程等待该子线程完成,然后主线程再继续执行,对于不会停止的线程,不要使用join(),防止阻塞其他线程),或调用detach()(调用detach()进行线程分离,使其不影响其他线程运行,比如一个线程中无限循环执行的场景下,需要detach())。如果join()和detach()都没有被调用,析构函数​将立即导致程序异常终止。C++20引入的std::jthread得以解决这个问题,std::jthread对象被析构时,会自动调用join(),等待执行流结束。​

​此外,​std::jthread​​支持外部请求中止操作​,调用join()后可能需要等待很长时间,甚至是永远等待。std::jthread除了提供std::stop_token能够主动取消或停止正在执行的线程,还增加了std::stop_callback允许在停止线程操作时调用一组回调函数。​

来看看cpprefercence关于std::jthread::~jthread的解释:

std::jthread::~jthread

Destroys the ​​jthread​​ object.

If ​​*​this​ has an associated thread (​joinable​()​ ​==​ ​true​​), calls request_stop() and then join().

Notes

The request_stop() has no effect if the ​​jthread​​ was previously requested to stop.

A ​​jthread​​ object does not have an associated thread after

  • it was default-constructed
  • it was moved from
  • join() has been called
  • detach() has been called

If join() throws an exception (e.g. because deadlock is detected),​​ std::terminate()​​ may be called.

关于​std::jthread::join​的作用:​阻塞当前线程直至 ​*​this 所标识的线程结束其执行。​

看例程:

#include <iostream>
#include <thread>
#include <chrono>void foo()
{// 模拟耗费大量资源的操作std::this_thread::sleep_for(std::chrono::seconds(1));
}void bar()
{// 模拟耗费大量资源的操作std::this_thread::sleep_for(std::chrono::seconds(1));
}int main()
{std::cout << "starting first helper...\n";std::jthread helper1(foo);std::cout << "starting second helper...\n";std::jthread helper2(bar);std::cout << "waiting for helpers to finish..." << std::endl;helper1.join();helper2.join();std::cout << "done!\n";
}

输出结果如下:

starting first helper...
starting second helper...
waiting for helpers to finish...
done!

std::jthread::joinable​,主要是用来检查 std::jthread 对象是否标识活跃的执行线程,直接看cpprefercence相关例程:

#include <iostream>
#include <thread>
#include <chrono>void foo()
{std::this_thread::sleep_for(std::chrono::seconds(1));
}int main()
{std::jthread t;std::cout << "before starting, joinable: " << std::boolalpha << t.joinable()<< '\n';t = std::thread(foo);std::cout << "after starting, joinable: " << t.joinable() << '\n';t.join();std::cout << "after joining, joinable: " << t.joinable() << '\n';
}

输出结果如下:

before starting, joinable: false
after starting, joinable: true
after joining, joinable: false

可知如果 jthread 对象标识活跃的执行线程则为 true ,否则为 false 。

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

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

相关文章

Win11如何调整任务栏大小 Win11调整任务栏大小的方法

现在已经有很多小伙伴都已经安装Win11系统进行体验了&#xff0c;但有一些小伙伴在体验的时候想要更改任务栏大小却不知道如何操作&#xff0c;那么碰到这种问题应该怎么办呢?下面就和小编一起来看看有什么解决方法吧。 Win11调整任务栏大小的方法 1、win11的任务栏大小&…

Unity3D平台实现全景实时RTMP|RTSP流渲染

好多开发者的使用场景&#xff0c;需要在Windows特别是Android平台实现Unity3D的全景实时视频渲染&#xff0c;本文以Windows平台为例&#xff0c;简单介绍下具体实现&#xff1a; 如果是RTSP或RTMP流数据&#xff0c;实际上难点&#xff0c;主要在于拉取RTSP或RTMP流&#xf…

C++17新特性之std::string_view

std::string_view系C17标准发布后新增的内容&#xff0c;类成员变量包含两个部分&#xff1a;字符串指针和字符串长度&#xff0c;相比std::string, std::string_view涵盖了std::string的所有只读接口。如果生成的std::string无需进行修改操作&#xff0c;可以把std::string转换…

谷歌浏览器该扩展程序未列在Chrome网上应用店中解决方法

很多用户在谷歌浏览器中安装扩展程序的时候会发现有些扩展程序安装后会显示红字“该扩展程序未列在Chrome网上应用店中”&#xff0c;然后插件未能正常启用&#xff0c;这让其很是苦恼&#xff0c;那么下面就来说一下如何解决这类插件安装的问题。 谷歌浏览器该扩展程序未列在…

Android平台实现RTSP|RTMP转GB28181网关接入

背景 在事先Android平台RTSP、RTMP转GB28181网关之前&#xff0c;我们已经实现了Android平台GB28181的接入&#xff0c;可实现Android平台采集到的音视频数据&#xff0c;编码后&#xff0c;打包按需发到GB28181服务平台。此外&#xff0c;拉流端&#xff0c;我们已经有了成熟…

一句话解释C++指针和引用区别

记住一句话就够了&#xff1a;指针三心二意&#xff0c;引用从一而终&#xff01; 指针是一个实体&#xff0c;而引用可理解为一个别名&#xff1b; ”sizeof(指针)”得到的是指针本身的大小&#xff0c;”sizeof(引用)”返回所指向的变量(对象)的大小。 引用一定不为空&…

大地Win11 64位全新专业版系统V2021.08

大地Win11 64位全新专业版系统V2021.08以微软官方原版作为母盘对系统进行了全面优化更新&#xff0c;用户使用更加流畅顺手&#xff0c;轻松体验到系统的优秀性能&#xff0c;适用目前市场最新机型以及老旧机型&#xff0c;多种安装方式供用户选择&#xff0c;且更新时间短无需…

Unity3D下实现Linux平台RTMP推流(以采集Unity窗体和声音为例)

技术背景 随着物联网等行业的崛起&#xff0c;越来越多的传统行业如虚拟仿真、航天工业、工业仿真、城市规划等&#xff0c;对Linux下的生态构建&#xff0c;有了更大的期望&#xff0c;Linux平台下&#xff0c;可选的直播推拉流解决方案相对Windows和移动端&#xff0c;非常少…

电脑公司Win11 64位全新旗舰版镜像V2021.08

电脑公司Win11 64位全新旗舰版镜像V2021.08以微软官方原版作为母盘对系统进行了全面优化更新&#xff0c;用户使用更加流畅顺手&#xff0c;轻松体验到系统的优秀性能&#xff0c;适用目前市场最新机型以及老旧机型&#xff0c;多种安装方式供用户选择&#xff0c;且更新时间短…

Android平台实现VR头显Unity下音视频数据RTMP推送

背景 随着技术发展的日新月异&#xff0c;虚拟现实产业已经从过去的探索期&#xff0c;自2020年起&#xff0c;慢慢过渡到高速发展期&#xff0c;随着5G时代的到来&#xff0c;大带宽高可靠低延迟网络环境&#xff0c;为虚拟现实产业提供了很好的网络保障&#xff0c;虚拟现实…

如何快速区分C++左值和右值

C左值和右值&#xff0c;初学者经常傻傻分不清&#xff0c;可参看“C Primer”书中的描述&#xff0c;简单来说&#xff1a; 当一个对象被用作右值的时候&#xff0c;用的是对象的值&#xff08;内容&#xff09;&#xff1b;当对象被用作左值的时候&#xff0c;用的是对象的身…

Win11将沿用Win10升级模式 并会有LTSC版本

微软官方已经确认 Windows 11 将沿用 Windows 10 的升级模式&#xff0c;包括每月的安全更新、可选累积更新、紧急的带外更新、服务栈更新等等。此外&#xff0c;微软还确认将会有个长期服务渠道&#xff08;LTSC&#xff09;版本的 Windows 11。 在近日更新的官方支持文档中&…

C++11特性之std:call_once介绍

std:call_once是C11引入的新特性&#xff0c;如需使用&#xff0c;只需要#include <mutex>即可&#xff0c;简单来说std:call_once的作用&#xff0c;确保函数或代码片段在多线程环境下&#xff0c;只需要执行一次&#xff0c;常用的场景如Init()操作或一些系统参数的获取…

2022年了,该学C++还是Java?

最近好多朋友私信我&#xff0c;C好不好学&#xff1f;学C好还是Java好&#xff1f; 我的回答是&#xff1a;C不好学&#xff0c;但你觉得C不好学的话&#xff0c;Java也不好学。因为C难是难在语言本身&#xff0c;java难是难在各种框架和库。 C学习进阶比较陡, 对新手不友好&…

Outlook怎么打印日历 Outlook日历打印教程

Outlook中的日历想要打印出来&#xff0c;该怎么打印日历呢?下面我们就来看看详细的教程。 Outlook怎么打印日历? Outlook日历打印教程 1、下载安装outlook软件。 Outlook怎么打印日历? Outlook日历打印教程 2、双击打开outlook软件&#xff0c;登入邮箱账户。 Outlook…

Android平台音视频RTMP推送|GB28181对接之动态水印设计

技术背景 随着移动单兵、智能车载、智慧安防、智能家居、工业仿真、GB28281技术对接等行业的发展&#xff0c;现场已经不再限于采集到视频数据编码打包发送或对接到流媒体服务端&#xff0c;大多场景对视频水印的要求越来越高&#xff0c;从之前的固定位置静态文字水印、png水…

TIM怎么更新版本 TIM检查更新版本教程

TIM是非常好用的软件&#xff0c;与传统的QQ比起来比较轻便&#xff0c;简洁大方&#xff0c;今天小编教大家怎样TIM检查更新。 TIM检查更新版本教程 首先&#xff0c;打开TIM&#xff0c;如下图所示&#xff0c;TIM是这个图标&#xff0c;如果在metro界面&#xff0c;就是第…

探究C++11智能指针之std::unique_ptr

背景 谈起C&#xff0c;它被公认为最难学的编程语言之一&#xff0c;不仅语法知识点广泛&#xff0c;细节内容之多&#xff0c;学习难度和学习周期也长&#xff0c;导致好多新入行的开发者对C“敬而远之”&#xff0c;甚至“从入门到放弃”。自C11开始&#xff0c;好多C程序员…

C++17新特性之try_emplace与insert_or_assign

由于std::map中&#xff0c;元素的key是唯一的&#xff0c;我们经常遇到这样的场景&#xff0c;向map中插入元素时&#xff0c;先检测map指定的key是否存在&#xff0c;不存在时才做插入操作&#xff0c;如果存在&#xff0c;直接取出来使用&#xff0c;或者key不存在时&#x…

Foxmail邮件字体大小怎么设置 Foxmail字体的设置方法

Foxmail写邮件的时候&#xff0c;想要设置邮件的字体&#xff0c;和字体大小&#xff0c;该怎么设置呢?下面我们就来看看详细的教程。 Foxmail邮件字体大小怎么设置? Foxmail字体的设置方法 1、下载并安装Foxmail邮件客户端。 Foxmail邮件字体大小怎么设置? Foxmail字体的…