一部のマルチスレッドコードでは、すべての例外をキャプチャして、それらを単一の例外処理スレッドに渡したいと思います。メッセージパッシングフレームワークは次のとおりです。
#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
複数回呼び出すことによって、アクティブな例外を複製することは正当ですか?