Для некоторого многопоточного кода я хотел бы зафиксировать все исключения и передать их одному потоку обработки исключений. Здесь схема передачи сообщений:
#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 для обработки всех опубликованных исключений.
Теперь мне было интересно, что произойдет, если я отправлю копии этого сообщения нескольким получателям. В общем, mes & shy; sa & shy; ges может иметь любое количество получателей, и поэтому я не хочу устанавливать произвольные ограничения на исключения pro & shy; сообщения pa & shy; ga & shy; exception_ptr
задокументирован как интеллектуальный указатель "совместного использования", а rethrow_exception
"не вводит гонку данных".
Итак, мой вопрос: законно ли дублировать активное исключение, сохраняя его в exception_ptr
, copy & shy, указав указатель и вызывая rethrow_exception
несколько раз?