Ответ 1
Этот ответ суммирует ответы, приведенные в комментариях, и ответ теперь удален:
-
Он не указан в стандарте (DeiDei, я тоже проверил в N4618)
-
Тем не менее, по техническим причинам маловероятно, что обработчик вызывается в другом потоке, который вызвал вызов
std::terminate
(Galik, Hans Passant) -
он был проверен в онлайн-компиляторе (Rinat Veliakhmedov), обработчик terminate вызывается в потоке, который вызывает вызов terminate.
Вы можете проверить его самостоятельно с помощью этого кода из удаленного ответа:
#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 с pthreads)