首页 > 其他分享 >std::thread和std::jthread的区别

std::thread和std::jthread的区别

时间:2024-05-18 10:29:30浏览次数:25  
标签:std thread RAII 线程 jthread 异常

`jthread` 和 `std::thread` 是 C++ 标准库中用于创建和管理线程的两个类。它们的主要区别在于线程的管理方式和对异常的处理:

1. **RAII(Resource Acquisition Is Initialization)语义:**
- `std::thread` 在销毁时,如果线程仍在运行,需要显式调用 `join()` 或 `detach()` 方法来等待或分离线程,否则会导致未定义行为或资源泄漏。
- `jthread` 在销毁时会自动等待其关联的线程结束,不需要显式调用 `join()` 或 `detach()` 方法,因此更符合 RAII 的原则,可以更方便地避免资源泄漏。

2. **异常处理:**
- 当使用 `std::thread` 时,如果线程函数抛出了异常并且没有被捕获,程序会调用 `std::terminate()` 来终止整个程序。
- `jthread` 在销毁时会检查线程函数是否抛出了异常,如果有未捕获的异常,会调用 `std::terminate()` 来终止整个程序。因此,`jthread` 更加安全,可以更容易地处理线程函数抛出的异常。

综上所述,主要区别在于 `jthread` 类型提供了更好的 RAII 语义和异常处理,使得线程管理更加方便和安全。在大多数情况下,推荐使用 `jthread` 类型来管理线程。

标签:std,thread,RAII,线程,jthread,异常
From: https://www.cnblogs.com/whcjob/p/18199103

相关文章

  • Golang初学:获取程序内存使用情况,std runtime
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linux--- 序章本文介绍golang程序占用内存的监控:使用stdruntime的ReadMemStats函数。 ReadMemStats函数https://pkg.go.dev/[email protected]//函数funcReadMemStats(m*MemStats......
  • python代码上传文件到fastdfs
    Install直接pip安装,需要Python3.10+pipinstallfastdfs-clientInitialclient可以用其他教程的client.conf配置文件的方式,也可以直接传入ip列表进行初始化fromfastdfs_clientimportFastdfsClientclient=FastdfsClient(trackers=('ip1','ip2',...))Uploadbyfil......
  • kotlin-stdlib-jdk8 的作用
    在kotlin1.8.0之前,kotlin的标准库kotlin-stdlib的jvmTarget是Java1.6,但是如果程序的jvmTarget是1.7或1.8,则可以手动添加kotlin-stdlib-jdk7或kotlin-stdlib-jdk8来使用kotin对相关Java版本提供的API(如:Java1.7中AutoCloseable相关的API和Java1.8......
  • 优秀开源(6)TransmittableThreadLocal
    序言 ThreadLocal存在的问题在多线程环境下,ThreadLocal可以避免线程安全问题,但是在使用线程池等多线程环境时,ThreadLocal可能会出现一些问题。例如,当使用线程池时,线程池中的线程可能会被多个任务共享,如果使用ThreadLocal存储数据,可能会导致数据被错误地共享。TransmittableTh......
  • C++封装dll(__cdecl和__stdcall)
    【1】使用__stdcall还需要添加def文件编译,使用工具DEPENDS.EXE打开dll文件成功。【2】使用__cdecl直接编译即可,不需要导入def文件......
  • FastDFS系统支持文件迁移吗?
    大家知道,FastDFS架构是下图这样子。  大家可否知道,将一个fdfs系统里存储的文件迁移到另一个fdfs系统里,这个文件在新的fdfs系统能通过client正常访问吗?先说答案:fastdfs系统支持文件迁移。亲测为证!这一个技术点很重要,对于我们即将要做的工作来说。就是说,将一个fdfs存储服务......
  • Python 内置库 多线程threading使用讲解
    线程基本使用单线程defmain():print("在扔一个苹果")if__name__=="__main__":main()多线程Python提供了thread、threading等模块来进行线程的创建与管理,后者在线程管理能力上更进一步,因此我们通常使用threading模块。创建一个线程需要指定该线程执行的任务(函......
  • 记一次ThreadLocal中的用户信息混乱问题
    前言记录一次开发中遇到的关于ThreadLocal问题,场景是数据库表中的操作人总是无缘无故的被更改,排查了几遍代码才发现是ThreadLocal没有及时清理导致的。一、为什么使用ThreadLocal1.ThreadLocal的好处一般的项目设计开发中,用户登录后,我们会将用户的信息存到Session,如......
  • SystemVerilog -- 3.2 SystemVerilog Threads --> fork join_any
    forkjoin_any在一个简单的SystemVerilog中,mainthread会等到所有childthread都完成执行。这意味着如果任何childthread永远运行并且永远不会完成,则fork将挂起模拟。SystemVerilog还提供了带有forkjoin和forkjoin_any的原始版和变体。如果任何一个childthread完成,则允许ma......
  • SystemVerilog -- 3.1 SystemVerilog Threads --> fork join
    forkjoinSystemVerilog通过构造提供对并行或并发threads的支持。可以使用fork和join同时生成多个proceduralblocks。有一些变体允许mainthread根据childthread何时完成继续执行其余语句。Syntaxfork//Thread1//Thread2//...//Thread3joinforkjoin......