0

0

c++如何使用std::thread::join_c++线程等待与资源回收【避坑】

尼克

尼克

发布时间:2026-02-17 02:03:33

|

318人浏览过

|

来源于php中文网

原创

std::thread::join()必须在对象销毁前调用,否则析构时触发std::terminate()导致程序崩溃;应使用std::jthread(c++20)自动管理或确保所有路径显式join()/detach()。

c++如何使用std::thread::join_c++线程等待与资源回收【避坑】

std::thread::join() 必须在对象销毁前调用

不调用 join()detach() 就让 std::thread 对象析构,会触发 std::terminate() —— 程序直接崩溃,无异常可捕获。这是最常见也最致命的坑。

  • 原因:C++ 强制要求线程资源必须被明确归属(加入主线程等待,或彻底分离)
  • 典型错误场景:局部 std::thread 对象未显式 join() 就离开作用域;异常路径下跳过了 join()
  • 安全写法:用 RAII 封装,比如 std::jthread(C++20),或手动确保 join() 在所有退出路径执行(包括 return、异常抛出)

join() 和 detach() 的行为差异直接影响资源归属

join() 是同步等待,调用线程阻塞直到目标线程执行完毕;detach() 则是“断开连接”,目标线程后台运行,系统自动回收其资源 —— 但你再也无法控制或等待它。

  • join() 后,该 std::thread 对象变为不可 joinable 状态(t.joinable() == false
  • detach() 后同样变为不可 joinable,但若原线程访问了已销毁的栈/局部变量,极易引发未定义行为(如访问悬垂指针)
  • 不要对同一个 std::thread 多次调用 join()detach(),会抛 std::system_error(error_code = resource_deadlock_would_occur

避免 join() 被遗忘:用 std::jthread 替代(C++20)

std::jthreadstd::thread 的安全替代,构造时接受可调用对象,并在析构时自动调用 join()(除非已手动 detach() 或移动走)。

Melodio
Melodio

Melodio是全球首款个性化AI流媒体音乐平台,能够根据用户场景或心情生成定制化音乐。

下载
std::jthread t([]{
    std::this_thread::sleep_for(100ms);
});
// 离开作用域时自动 join(),无需显式写 t.join()
  • 比手写 try/catch + finally-风格 RAII 更简洁可靠
  • 支持 request_stop() 和协作式中断(配合 std::stop_token),适合需响应取消的长期任务
  • 注意:若线程函数内部死循环且不检查 stop token,join() 仍会无限等待

join() 可能永久阻塞:必须考虑超时与取消机制

std::thread::join() 本身不支持超时;一旦目标线程卡住(如死锁、无限循环),调用方就永远卡住。生产环境几乎从不直接裸用 join()

立即学习C++免费学习笔记(深入)”;

  • C++20 前:只能靠外部信号(如原子标志 + 条件变量)实现协作式退出,再 join()
  • C++20 起:优先用 std::jthread + std::stop_source 实现可中断等待
  • 切勿在线程中直接操作 GUI、文件句柄等非线程安全资源后还期望干净 join() —— 资源竞争可能导致 join 前就崩溃
实际线程生命周期管理最难的部分,往往不是语法怎么写,而是“什么时候算真正结束”——比如网络请求线程收到 EOF 后是否还要处理缓冲区?日志线程是否要刷盘完成才退出?这些逻辑必须和 join() 的位置严格对齐。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6395

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

835

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1084

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1595

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

418

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

592

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

675

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

94

2025.12.01

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.6万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号