В каком потоке вызывается обработчик завершения:
когда исключение выбрасывается внутри noexcept
функционировать?
когда пользователь звонит std::terminate
()?
при запуске или уничтожении thread
?
Это определено в стандарте, будет ли у меня доступ к thread_local
объекты?
Этот ответ суммирует ответы, данные в комментариях, и ответ теперь удален:
Не указано в стандарте (DeiDei, Я тоже проверил в N4618)
Тем не менее, по техническим причинам маловероятно, что обработчик вызывается в другом потоке, который вызвал вызов std::terminate
(Galik,Ганс Пассант)
это было проверено на онлайн-компиляторе (Ринат Велиахмедов), обработчик завершения вызывается в потоке, вызывающем вызов завершения.
Вы можете проверить это самостоятельно с помощью этого кода из удаленного ответа:
#include <string>
#include <exception>
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mutex;
const auto& id = std::this_thread::get_id;
const auto print = [](std::string t){
std::lock_guard<std::mutex> lock(mutex);
std::cout << id() << " " << t << std::endl;
};
void my_terminate_handler(){
print("terminate");
std::abort();
}
void throwNoThrow() noexcept { throw std::exception(); }
void terminator() { std::terminate(); }
int main() {
std::set_terminate(my_terminate_handler);
print("main");
#ifdef CASE1
auto x1 = std::thread(throwNoThrow);
#elif CASE2
auto x1 = std::thread(terminator);
#elif CASE3
auto x1 = std::thread(throwNoThrow);
#endif
x1.join();
}
Заключение Это не определено, но кажется, что обработчик всегда вызывается в потоке, который вызывает std::terminate
быть названным. (проверено на gcc-5.4, gcc-7.1, clang-3.8 с нитями)
Других решений пока нет …