Ich habe ein Problem mit Ausnahmen in Multithreaded C++ - Code. Das folgende Programm wird mit terminate called without an active exception Aborted (core dumped)
beendet.Std :: Thread und Exception-Behandlung
#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();
}
}
Stattdessen würde Ich mag die Ausnahme im try catch
Block in main()
zu handhaben. Ich verstehe, dass Ausnahmen (normalerweise) nicht zwischen Threads übergeben werden, da Threads jeweils einen eigenen Stack haben. Das Problem hier (so scheint es mir) ist, dass die Ausnahme nicht behandelt wird, obwohl sie auf dem nicht gespaltenen Thread generiert wird. Wenn ich die Zeilen in run()
mit control_thread
kommentieren, funktioniert alles gut.
Zusammengestellt mit clang-3.8 und -std=c++11 main.cpp -lpthread
.
@Curious Vielleicht. Ich kenne 'exception_ptr'. Aber das Problem hier (denke ich ..) ist, dass Werfer (runComponent) tatsächlich auf dem Hauptthread ist. Muss ich den Ausnahmezeiger auch in diesem Fall verwenden? – jonnew
Beantwortet in der Antwort unten! Ich habe die Frage falsch verstanden – Curious