news 2026/9/3 4:48:34

线程函数中抛出的未捕获异常

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线程函数中抛出的未捕获异常

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

      • 崩溃原因分析
      • 修复后的完整代码
      • 关键修改说明
      • 运行结果示例
      • 总结

#include<iostream>#include<thread>#include<mutex>#include<vector>#include<stdexcept>intg_count=0;std::mutex g_mutex;voidincrementSafe(inttimes){for(inti=0;i<times;++i){// RAII:构造时加锁,析构时解锁(即使异常也会解锁)std::lock_guard<std::mutex>lock(g_mutex);// 模拟异常if(i==500){// 异常抛出时,lock的析构函数会被调用,自动解锁throwstd::runtime_error("意外异常");}g_count++;}}intmain(){constintthread_num=5;constinttimes_per_thread=1000;std::vector<std::thread>threads;try{for(inti=0;i<thread_num;++i){threads.emplace_back(incrementSafe,times_per_thread);}for(auto&t:threads){t.join();}}catch(conststd::exception&e){std::cout<<"捕获异常:"<<e.what()<<std::endl;}std::cout<<"最终count值:"<<g_count<<std::endl;return0;}

上篇文章中代码运行崩溃

崩溃原因分析

这段代码崩溃的核心原因是:线程函数中抛出的未捕获异常无法被主线程的catch捕获
C++ 线程的规则是:如果线程函数内部抛出异常且没有在线程内捕获,该异常会直接触发std::terminate()函数,导致整个程序强制终止(崩溃),主线程的try-catch完全无法拦截这种跨线程的异常。

虽然std::lock_guard的 RAII 特性确实能保证异常时解锁(这部分是正确的),但异常本身没有被处理,最终导致程序崩溃。

修复后的完整代码

下面是修复后的代码,核心思路是在线程函数内部捕获异常,避免异常逃逸出线程;同时保留原有的线程安全和 RAII 锁特性:

#include<iostream>#include<thread>#include<mutex>#include<vector>#include<stdexcept>intg_count=0;std::mutex g_mutex;voidincrementSafe(inttimes){try{// 线程内部捕获异常,避免异常逃逸for(inti=0;i<times;++i){// RAII:构造时加锁,析构时解锁(即使异常也会解锁)std::lock_guard<std::mutex>lock(g_mutex);// 模拟异常if(i==500){throwstd::runtime_error("意外异常");}g_count++;}}catch(conststd::exception&e){// 线程内处理异常,也可以记录日志、通知主线程等std::lock_guard<std::mutex>lock(g_mutex);// 加锁保证输出线程安全std::cout<<"线程内捕获异常:"<<e.what()<<std::endl;}}intmain(){constintthread_num=5;constinttimes_per_thread=1000;std::vector<std::thread>threads;// 创建并启动所有线程for(inti=0;i<thread_num;++i){threads.emplace_back(incrementSafe,times_per_thread);}// 等待所有线程执行完成for(auto&t:threads){if(t.joinable()){// 检查线程是否可join,避免重复joint.join();}}std::cout<<"最终count值:"<<g_count<<std::endl;return0;}

关键修改说明

  1. 线程内增加try-catch:在incrementSafe函数开头添加try块,捕获函数内抛出的所有异常,避免异常逃逸出线程导致程序崩溃;
  2. 线程安全的异常输出:异常信息输出时也加了互斥锁,避免多个线程同时输出导致乱码;
  3. 增加joinable()检查:防止因异常导致线程状态异常时重复join,提升代码健壮性;
  4. 移除主线程多余的try-catch:因为线程内的异常已被处理,主线程无需再捕获(如果需要主线程感知异常,可以用std::future,新手阶段先掌握线程内捕获即可)。

运行结果示例

运行后你会看到类似这样的输出(顺序可能因线程调度略有不同):

线程内捕获异常:意外异常 线程内捕获异常:意外异常 线程内捕获异常:意外异常 线程内捕获异常:意外异常 线程内捕获异常:意外异常 最终count值:2500

(每个线程执行到第500次时抛出异常,所以每个线程只执行了500次计数,5个线程总计 5×500=2500)

总结

  1. 核心崩溃原因:线程内未捕获的异常会触发std::terminate(),无法被主线程catch拦截;
  2. 关键修复手段:在线程函数内部捕获并处理异常,是新手阶段最稳妥的方式;
  3. RAII 锁的价值:即使抛出异常,std::lock_guard也会自动析构解锁,不会导致死锁,这部分原代码的设计是正确的。

如果需要让主线程感知到线程内的异常(而非仅在线程内处理),可以基于std::packaged_taskstd::future实现,你有需要的话我可以补充这部分代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 19:25:27

小程序计算机毕设之基于微信小程序的驾校考试预约系统的设计与实现基于微信小程序的驾校预约系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/3 0:18:54

【课程设计/毕业设计】基于SpringBoot与微信小程序的驾校预约管理系统设计与实现基于微信小程序的驾校预约系统的设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/2 22:05:27

公司新来的前端虽然水,但比很多人明智

部门新招了个前端&#xff0c;简历上三年经验&#xff0c;实际一上手就露怯。Vue只会用this.调API&#xff0c;CSS布局全靠flex硬撑&#xff0c;遇到稍微复杂点的状态流转就想着绕路走。 但奇怪的是&#xff0c;没人在背后说他“水”——因为他太清楚自己哪里不会了。 这种“…

作者头像 李华
网站建设 2026/9/2 22:05:32

总结19个WEB常见安全漏洞及应对方案

随着Web2.0、网络社交等一系列新型的互联网产品的诞生&#xff0c;基于Web环境的互联网应用越来越广泛&#xff0c;企业信息化的过程中&#xff0c;越来越多的应用都架设在Web平台上。Web业务的迅速发展吸引了黑客们的强烈关注&#xff0c;接踵而至的就是Web安全威胁的凸显。黑…

作者头像 李华
网站建设 2026/9/2 22:50:04

孤能子视角:“联结主义(神经网络)认知心理学“

第一步&#xff1a;分析“作者”——联结主义/神经网络范式&#xff08;作为对经典认知范式的“生物学启发的逆袭”孤能子&#xff09;启动&#xff1a;三力逼问&#xff0c;定位张力1. 零预设&#xff1a;不预设联结主义是“真正的智能模型”或“数学黑箱”&#xff0c;视其为…

作者头像 李华
网站建设 2026/9/2 22:05:26

吐血推荐!专科生必备9款AI论文写作软件测评

吐血推荐&#xff01;专科生必备9款AI论文写作软件测评 2026年专科生AI论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的AI写作软件&…

作者头像 李华