0

0

C++异常与并发 多线程异常协调处理

P粉602998670

P粉602998670

发布时间:2025-08-26 11:05:01

|

380人浏览过

|

来源于php中文网

原创

多线程中未捕获的异常会终止整个程序,因此需在每个线程函数中使用try-catch捕获std::exception等异常,记录日志或通知主线程,防止程序崩溃和资源泄漏。

c++异常与并发 多线程异常协调处理

在C++多线程程序中,异常处理比单线程复杂得多。线程中抛出的异常如果未在该线程内捕获,会导致整个程序调用 std::terminate,即使其他线程仍在运行。因此,多线程环境下的异常协调处理至关重要,必须确保异常被正确传播或记录,避免资源泄漏或程序崩溃。

线程内异常应被及时捕获

每个线程的入口函数都应包含顶层异常捕获机制,防止未处理异常导致线程终止并引发整个程序退出。

- 每个线程函数建议使用 try-catch 包裹 - 捕获所有可能异常(如 std::exception 及其派生类) - 可选择记录日志、设置错误状态或通知主线程

示例:

void worker_thread() {
    try {
        // 业务逻辑,可能抛出异常
        do_work();
    } catch (const std::exception& e) {
        std::cerr << "Exception in thread: " << e.what() << std::endl;
        // 可通过共享变量或队列通知主线程
    }
}

跨线程传递异常信息

有时需要将子线程中的异常传递给主线程处理。C++ 提供了 std::exception_ptr 来捕获和传递异常对象。

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

- 使用 std::current_exception() 获取当前异常指针 - 通过共享数据结构(如 promise、队列)传递 exception_ptr - 在接收线程中用 rethrow_exception() 重新抛出

示例:使用 std::promise 传递异常

自学 PHP、MySQL和Apache
自学 PHP、MySQL和Apache

本书将PHP开发与MySQL应用相结合,分别对PHP和MySQL做了深入浅出的分析,不仅介绍PHP和MySQL的一般概念,而且对PHP和MySQL的Web应用做了较全面的阐述,并包括几个经典且实用的例子。 本书是第4版,经过了全面的更新、重写和扩展,包括PHP5.3最新改进的特性(例如,更好的错误和异常处理),MySQL的存储过程和存储引擎,Ajax技术与Web2.0以及Web应用需要注意的安全

下载
std::promise result_promise;

void worker() { try { throw std::runtime_error("Something went wrong"); } catch (...) { result_promise.set_exception(std::current_exception()); } }

int main() { std::thread t(worker); t.join();

try {
    result_promise.get_future().get();
} catch (const std::exception& e) {
    std::cout << "Caught exception: " << e.what() << std::endl;
}
return 0;

}

避免跨线程直接抛出异常

C++ 标准不允许一个线程直接抛出异常并由另一个线程捕获。异常栈展开仅在抛出异常的线程内有效。

- 不要试图在 thread A 中 throw,让 thread B catch - 异常传播必须通过显式机制(如 promise、自定义错误通道) - 多线程同步结构(互斥量、条件变量)不会自动处理异常传播

错误做法(不可行):

// 错误:不能跨线程 catch 别人抛的异常
std::thread t([]{
    throw std::logic_error("No one can catch this directly");
});
t.join(); // 程序终止

结合 future 和 async 的异常处理

使用 std::async 启动任务时,异常会被自动捕获并存储在 shared state 中,通过 future::get() 重新抛出。

- async 返回的 future 可安全捕获异常 - 异常在 get() 调用时 rethrow - 适用于任务型并发模型

示例:

auto future = std::async(std::launch::async, []() {
    throw std::runtime_error("Error in async task");
});

try { future.get(); } catch (const std::exception& e) { std::cout << "Async exception: " << e.what() << std::endl; }

基本上就这些。多线程异常处理的关键是:不依赖默认行为,主动捕获、传递和处理异常。使用 std::exception_ptr 和 future 等机制,可以实现安全的跨线程错误通知,避免程序意外终止。设计并发系统时,异常协调应作为错误处理方案的一部分提前规划。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

6

2025.12.22

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

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

368

2023.07.18

堆和栈区别
堆和栈区别

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

563

2023.08.10

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

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

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

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

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

7

2025.12.31

热门下载

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

精品课程

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

共162课时 | 10.2万人学习

Java 教程
Java 教程

共578课时 | 40.1万人学习

HTML教程
HTML教程

共500课时 | 4.3万人学习

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

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