0

0

C++如何在多线程中处理异常

P粉602998670

P粉602998670

发布时间:2025-09-12 10:33:01

|

767人浏览过

|

来源于php中文网

原创

C++多线程异常处理需在线程内捕获或通过promise/future传递,避免程序终止。1. 线程函数用try-catch处理异常;2. std::promise结合set_exception可将异常传给主线程;3. std::packaged_task自动关联future,异常由get()重新抛出;4. 注意异常不逃逸、共享状态线程安全及future.get()仅调用一次。

c++如何在多线程中处理异常

在C++多线程编程中,异常处理比单线程复杂得多。线程函数中抛出的异常不能直接被主线程或其他线程捕获,未捕获的异常会导致整个程序调用 std::terminate,即使其他线程仍在运行。因此,必须显式地在线程内部处理异常,或通过特定机制将异常传递到其他线程。

1. 在线程函数中捕获并处理异常

最直接的方式是在每个线程函数中使用 try-catch 块,防止异常传播到线程入口函数之外。

  • 每个线程应自行处理可能抛出的异常,避免程序意外终止。
  • 可以在 catch 块中记录日志、设置状态标志或通知其他线程。

示例:

void threadFunction() {
    try {
        // 可能抛出异常的操作
        riskyOperation();
    } catch (const std::exception& e) {
        std::cerr << "线程捕获异常: " << e.what() << std::endl;
    }
}

2. 使用 std::promise 传递异常

如果需要将异常从子线程传递给主线程,可以使用 std::promisestd::future。通过 promise 的 set_exception 方法,可以把异常对象传递出去。

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

Intermediate Perl 电子书 chm版
Intermediate Perl 电子书 chm版

从一个Perl爱好者到一个Perl程序员。《Intermediate Perl》将教您如何把Perl作为编程语言来使用,而不仅只是作为一种脚本语言。   Perl是一种灵活多变、功能强大的编程语言,可以应用在从系统管理到网络编程再到数据库操作等很多方面。人们常说Perl让容易的事情变简单、让困难的事情变得可行。《Intermediate Perl》正是关于如何将技能从处理简单任务跃升到胜任困难任务的书籍。   本书提供对Perl中级编程优雅而仔细的介绍。由畅销的《学习Perl》作者所著,本书提供了《学习P

下载
  • 在线程中捕获异常后,调用 promise.set_exception(std::current_exception()) 保存异常。
  • 主线程通过 future.get() 获取结果或重新抛出异常。

示例:

void task(std::promise& result) {
    try {
        // 模拟可能失败的操作
        throw std::runtime_error("任务执行失败");
    } catch (...) {
        result.set_exception(std::current_exception());
    }
}

int main() {
    std::promise prom;
    std::future fut = prom.get_future();
    std::thread t(task, std::ref(prom));

    try {
        int value = fut.get(); // 这里会重新抛出异常
        std::cout << "结果: " << value << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "主线程捕获异常: " << e.what() << std::endl;
    }

    t.join();
    return 0;
}

3. 使用 std::packaged_task 包装可调用对象

std::packaged_task 自动关联一个 future,适合封装可能抛出异常的函数。

  • 任务执行时若抛出异常,会自动设置到关联的 future 中。
  • 调用 future.get() 时异常会被重新抛出。

示例:

std::packaged_task task([]() {
    throw std::logic_error("逻辑错误");
});

std::future fut = task.get_future();
std::thread t(std::move(task));

try {
    fut.get();
} catch (const std::exception& e) {
    std::cerr << "捕获任务异常: " << e.what() << std::endl;
}

t.join();

4. 注意事项与最佳实践

  • 不要让异常在线程函数中“逃逸”,必须在 thread 函数内捕获。
  • 使用 std::current_exception() 可以复制当前异常,用于跨线程传递。
  • 多个线程可能同时抛出异常,确保共享状态(如日志、标志位)的线程安全。
  • future.get() 只能调用一次,重复调用会导致 undefined behavior。

基本上就这些。C++ 多线程异常处理的关键是:自己处理,或通过 promise/future 机制安全传递。不复杂,但容易忽略。

相关专题

更多
线程和进程的区别
线程和进程的区别

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

471

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

107

2025.12.24

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

107

2025.12.24

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

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

54

2025.12.01

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

3940

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2896

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

137

2025.12.25

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

296

2023.10.12

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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