У меня возникли проблемы с обработкой исключений в многопоточном коде C++. Следующая программа выходит с terminate called without an active exception Aborted (core dumped)
.std :: обработка потоков и исключений
#include <thread>
#include <iostream>
#include <stdexcept>
struct Thing {
void runComponent()
{
throw std::runtime_error("oh no!\n");
}
void runController()
{
while (true) {}
}
void run()
{
auto control_thread = std::thread([this] { runController(); });
runComponent();
if (control_thread.joinable())
control_thread.join();
}
};
int main()
{
try {
Thing thing;
thing.run();
} catch (std::runtime_error &ex) {
std::cerr << ex.what();
}
}
Вместо этого, я хотел бы, чтобы обработать исключение в блоке try catch
в main()
. Я понимаю, что исключения не передаются (обычно) между потоками, так как потоки имеют собственный стек. Проблема здесь (мне кажется) заключается в том, что исключение не обрабатывается, даже если оно генерируется в не-forked-потоке. Если я прокомментирую строки в run()
, имеющие отношение к control_thread
, все будет хорошо.
Составлено с clang-3.8 и -std=c++11 main.cpp -lpthread
.
@ Может быть. Я знаю «exception_ptr». Но проблема здесь (я думаю ..) заключается в том, что метатель (runComponent) фактически находится в основном потоке. Нужно ли использовать указатель исключения даже в этом случае? – jonnew
Ответил в ответе ниже! Я неправильно понял вопрос – Curious