对于一些多线程代码,我想捕获所有异常并将它们传递给单个异常处理线程。这是消息传递框架:
#include <exception>
struct message
{
virtual ~message() = default;
virtual void act() = 0;
};
struct exception_message : message
{
std::exception_ptr ep;
virtual void act()
{
std::rethrow_exception(ep);
}
// ...
};
这是用例:
try
{
// ...
}
catch (...)
{
exception_message em { std::current_exception(); }
handler_thread.post_message(em);
}
处理程序线程遍历它的所有消息和调用act()
,它可以安装自己的 try/catch 块来处理所有发布的异常。
现在我想知道如果我将此消息的副本发送给多个接收者会发生什么。一般来说,消息可能有任意数量的收件人,因此我不想对异常传播消息进行任意限制。这exception_ptr
被记录为“共享所有权”智能指针,并且rethrow_exception
“不会引入数据竞争”。
所以我的问题是:通过将活动异常存储在 中exception_ptr
、复制指针并rethrow_exception
多次调用来复制活动异常是否合法?