LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 222|回复: 0

在线程之间传输异常

[复制链接]
发表于 2024-1-25 22:28:23 | 显示全部楼层 |阅读模式
Microsoft C++ 编译器 (MSVC) 支持从一个线程向另一个线程传输异常。 通过传输异常,你可以在一个线程中捕获异常,然后使该异常看似是在另一个线程中引发的。 例如,你可以使用该功能编写多线程应用程序,其中主线程将处理其辅助线程引发的所有异常。 传输异常对创建并行编程库或系统的开发人员最有用处。 为实现传输异常,MSVC 提供了 exception_ptr 类型以及 current_exception、rethrow_exception 和 make_exception_ptr 函数。

语法
C++

复制
namespace std
{
   typedef unspecified exception_ptr;
   exception_ptr current_exception();
   void rethrow_exception(exception_ptr p);
   template<class E>
       exception_ptr make_exception_ptr(E e) noexcept;
}
参数
unspecified
用于实现 exception_ptr 类型的未指定的内部类。

p
引用异常的 exception_ptr 对象。

E
表示异常的类。

e
参数 E 类的实例。

返回值
current_exception 函数返回引用当前进行中的异常的 exception_ptr 对象。 如果没有进行中的异常,该函数将返回未与任何异常关联的exception_ptr对象。

make_exception_ptr函数返回引用e参数指定的异常的exception_ptr对象。

注解
方案
假设你要创建能伸缩以处理可变工作负荷的应用程序。 为了实现此目标,你要设计一个多线程应用程序,其中初始的主线程会创建所需数量的辅助线程,以完成该工作。 辅助线程可帮助主线程管理资源、平衡负载和提高吞吐量。 通过分发工作,多线程应用程序的表现优于单线程应用程序。

但是,如果辅助线程引发异常,你希望主线程予以处理。 这是因为你希望你的应用程序无论有多少辅助线程,都能以一致统一的方式处理异常。

解决方案
为处理先前的方案,C++ 标准支持在线程之间传输异常。 如果辅助线程引发异常,该异常会成为当前异常。 拿现实世界打比方,当前异常就好比处于动态的状态。 当前异常从引发之时到捕获它的异常处理程序返回之时就处于飞行状态。

辅助线程可在 catch 块中捕获当前异常,然后调用 current_exception 函数,将该异常存储在 exception_ptr 对象中。 exception_ptr 对象必须可用于辅助线程和主线程。 例如,exception_ptr 对象可以是全局变量,由 mutex 控制对它的访问。 术语“传输异常”指的是一个线程中的异常可以转换为可由其他线程访问的形式。

接下来,主线程调用 rethrow_exception 函数,该函数提取并继而引发 exception_ptr 对象中的异常。 异常引发后,将成为主线程中的当前异常。 也就是说,该异常看起来源自主线程。

最后,主线程可以在 catch 块中捕获当前异常,然后进行处理或将其抛给更高级别的异常处理程序。 或者,主线程可以忽略该异常并允许该进程结束。

大多数应用程序不必在线程之间传输异常。 但是,该功能在并行计算系统中有用,是因为该系统可以在辅助线程、处理器或内核间分配工作。 在并行计算环境中,单个专用线程可以处理辅助线程中的所有异常,并可以为任何应用程序提供一致的异常处理模型。

有关 C++ 标准委员会建议的详细信息,请在 Internet 中搜索编号为 N2179,标题为“Language Support for Transporting Exceptions between Threads”(在线程之间传输异常的语言支持)的文档。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表