Почему программа не может получить правильную инструкцию возврата после разматывания стека c ++?
Поскольку ваш код создает несколько потоков, и вы не перехватываете исключение в потоке, который фактически выдает исключение. Исключения не будут распространяться по потокам, даже если вы вызовете join()
функцию-член std::thread
.
Попробуйте блоки определены как динамические c конструкции стека. Блок try отлавливает исключения, генерируемые кодом, динамически достижимым по вызову, из его содержимого.
Когда вы создаете новый поток, вы создаете совершенно новый стек, который совсем не является частью динамического * 1029. * контекст блока try, даже если вызов try pthread_create
или конструкция присоединяемого std::thread()
находится внутри try.
Чтобы перехватить исключение, возникающее в потоке X, вы должны иметь try- Предложение catch в потоке X (например, вокруг всего в функции потока, аналогично тому, что вы уже делаете в main).
По вопросам, связанным с этим, см. Как распространять исключения между потоками? .
Пример:
#include <chrono>
#include <iostream>
#include <string>
#include <exception>
#include <iostream>
#include <thread>
struct Object {
void DoSomeWork()
{
std::cout << "DoSomeWork Thread ID: " << std::this_thread::get_id() << std::endl;
try {
std::thread thread(&Object::GenerateException, this);
thread.detach();
while(true);
}
catch (...) {
std::cout << "Caught exception: " << std::this_thread::get_id() << std::endl;
throw ;
}
}
void GenerateException(void)
{
std::cout << "GenerateException Thread ID: " << std::this_thread::get_id() << std::endl;
try {
std::this_thread::sleep_for (std::chrono::seconds(5));
throw std::runtime_error("Some error");
} catch (...) {
std::cout << "Caught exception: " << std::this_thread::get_id() << std::endl;
throw;
}
}
};
int main()
{
std::cout << "Main Thread ID: " << std::this_thread::get_id() << std::endl;
try {
Object instance;
std::thread th(&Object::DoSomeWork,std::ref(instance));
th.join();
}
catch (const std::exception &ex) {
std::cout << ex.what() << std::endl;
std::cout << "Exception caught at: " << std::this_thread::get_id() << std::endl;
}
std::cout << "never reach this" << std::endl;
return 0;
}
Выход:
Main Thread ID: 140596684195648
DoSomeWork Thread ID: 140596665124608
GenerateException Thread ID: 140596656670464
Caught exception: 140596656670464
terminate called after throwing an instance of 'std::runtime_error'
what(): Some error
Aborted (core dumped)