gpt4 book ai didi

c++ - 在哪个线程中调用终止处理程序?

转载 作者:可可西里 更新时间:2023-11-01 16:20:29 24 4
gpt4 key购买 nike

在哪个线程中调用终止处理程序:

  1. 当在 noexcept 函数中抛出异常时?

  2. 当用户调用 std::terminate() 时?

  3. thread 启动或销毁时?

它是否在标准中定义,我可以访问 thread_local 对象吗?

最佳答案

此答案总结了评论中给出的答案和现已删除的答案:

  • 标准中没有规定(DeiDei,我在N4618也查过了)

  • 然而,出于技术原因,不太可能在另一个线程中调用处理程序,而不是调用 std::terminate 的线程(Galik,汉斯·帕桑特)

  • 已在在线编译器(Rinat Veliakhmedov)上验证,在导致调用终止的线程中调用了终止处理程序。

您可以使用已删除答案中的这段代码自行测试:

#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 上测试)

关于c++ - 在哪个线程中调用终止处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44289671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com