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

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

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

  2. когда пользователь звонит std::terminate()?

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

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

10

Решение

Этот ответ суммирует ответы, данные в комментариях, и ответ теперь удален:

  • Не указано в стандарте (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 с нитями)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]