Подтвердить что ты не робот

В каком потоке называется обработчик terminate?

В котором поток называется обработчиком terminate:

  • когда исключение выбрано внутри функции noexcept?

  • когда пользователь вызывает std::terminate()?

  • при запуске или уничтожении thread?

Определен ли он в стандарте, будет ли у меня доступ к thread_local объектам?

4b9b3361

Ответ 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)