C++20中的新线程(jthread)功能

更新时间:2023-05-17 12:27:12 阅读: 评论:0

C++20中的新线程(jthread)功能
C ++ 20带来了许多很酷的新功能,其中⼀个我将在这⾥简单介绍⼀下:std::jthread。
这个的实现std::jthread基于已经存在的std::thread。它基本上是⼀个包装器,它为线程带来了两个新功能:默认情况下,它们可以协同中断并加⼊。在深⼊研究这两个术语之前,请注意该std::jthread对象包含std::thread⼀个成员,提供完全相同的公共函数,这些函数只是向下传递调⽤。这使我们可以将任何内容更改std::thread为std::jthread,确保它将像以前⼀样⼯作。
jthread是可协作中断的
该名称表明新的jthread是可中断的,即有⼀种⽅法可以阻⽌来⾃外部的线程。与C ++不同,在其他⼀些语⾔中,线程类具
有abort(),stop()或interrupt()函数,⽽且⼤部分都不是⽤户可能期望的,即kill开关。有些⼈可能会认为我们没有这样的东西是如此糟糕,std::thread⽽且现在std::jthread我们终于拥有了它。但它可以协作中断,理解这⼀点的最好⽅法是看⼀下它的功能:request_stop()。这个名字的选择⾮常谨慎。考虑这个例⼦:
蝙蝠鲨
挑战大海这⾥主线程创建⼀个新线程,它每秒都会重复执⾏某些操作(打印⼀⾏)。然后主线程继续执⾏5秒的作业,之后等待另⼀个线程完成。但它不会完成,它将继续运⾏,主线程将继续等待。
我们刚刚改变了thread,jthread并且,正如所承诺的,没有任何新的事情发⽣,它表现得像以前⼀样。现在让我们使⽤该函数在main完成后停⽌线程。
这编译并且有效,但它不会⽴即停⽌执⾏该线程,也不会停⽌执⾏。这没关系:注意,它说请求停⽌,⽽不是坚持或强制。所以我们(从线程外部)只能请求停⽌,并且该线程本⾝具有最终发⾔权。这就是它可以协作中断的原因。
这终于奏效了。当然,我们可以通过原⼦布尔来实现这⼀点,这是⼀个更⼴泛和值得信赖的版本。但问题仍然存在:我们为什么不在jthread上使⽤killswitch,特别是当其他语⾔(其他语⾔)这样做时?答案是:其他⼈没有真正拥有它,你也不想拥有它。
为什么⼀个killswitch是个坏主意?房产测绘
假设您已经从主线程创建了⼀个⼯作线程,并且在某些时候,您想要杀死它(⼯作者)。想象⼀下,有⼀个杀戮开关,⼀个功能:stop()
历史是什么从线程调度程序中删除worker ****(PAUSE)
释放⽤作堆栈的内存⼯作者,⽽不调⽤析构函数(WIPE OUT)
这⼏乎总能保证死锁或内存泄漏或两者兼⽽有之。所以这绝对是⼀个坏主意,⽆论如何都需要进⾏⼀些清理。其他语⾔主要做的是向⼯⼈抛出⼀个例外,它负责捕捉和清理你的肩膀。让我们不要忘记,这std::thread只是⼀个封⾯,⽽且⼤部分都是⼀个pthread底层。它也有⼏分相似,我们总native_han
dle()来⾃std::thread与它合作。但它更复杂。折翼的天使
是的,这很复杂。不要费⼼阅读。
但这个想法是⼀样的:在使⽤“killswitch”之前,你应该⾃⼰处理清理⼯作。
菠菜绿>适合送闺蜜的花现在,假设您正在发明⼀种⽀持多线程并具有Thread类的新语⾔。您是否会给它⼀个stop功能,这个功能并不是名称所暗⽰的,并且存在滥⽤的⾼风险?我不会,因此⽤户被迫以正确的⽅式找到⽅法。
月饼怎么做这正是我们在上⾯的⽰例中所做的,因此我们可以删除那⾥的最后两⾏。
但是,为什么join被选为⼀个jthread默认结束了吗?⾸先,它与detach相⽐⾮常安全,⽽且在⼤多数情况下,这是你真正需要的。
为了更好地理解detach的危险以及为什么加⼊应始终是您的选择,请检查:“让我为您分离这些线程”。
尽管它附带了C ++ 20,但它std::jthread并没有使⽤任何新的语⾔功能,所以它现在⼏乎可⽤。这是由提出它的⼈Nicolai Josuttis 实施的。您可以使⽤此存储库中的两个头⽂件来完全访问此新功能:“ sources /”中的 “ jthread.hpp”和“ *stop_token.hpp *”。

本文发布于:2023-05-17 12:27:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/667634.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:线程   功能   没有   主线   内存   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图