gpt4 book ai didi

c++ - 用户提供的 terminate() 函数必须是线程安全的吗?

转载 作者:可可西里 更新时间:2023-11-01 15:22:34 27 4
gpt4 key购买 nike

http://en.cppreference.com/w/cpp/error/terminate 中所述调用终止的原因有很多。我可以想象这样的情况,其中一些原因几乎同时发生在两个线程中。

Q1 std::set_terminate 设置的终止函数是否可以同时调用两次或更多次,同时我的意思是第二次调用在第一次调用之前开始结束了。

  Thread1   Thread2
| |
_ |
t |
e |
r |
m |
i _
n t
a e
t r
e m
- ?

Q2 如果 Q1==YES,那么如果第一个终止结束会发生什么。我想如果它以 std::abort 结束,那么程序就会结束,但是如果用户提供的终止没有中止程序会发生什么?

Q3 std::set_terminate 设置的终止函数是否在导致此终止调用的线程的上下文中调用?

最佳答案

第一季度

是的,std::terminate 可以并发调用。

第二季度

标准规定 terminate_handler 不“终止程序执行而不返回调用者”是未定义的行为。在我熟悉的实现中,如果 terminate_handler 尝试返回,无论是正常还是异常,都将调用 abort()

第三季度

std::terminate 设置的函数是全局的,不是线程局部的。所以一个线程可以影响另一个线程。

在 C++98/03 中,terminate 因未捕获的异常而被调用时使用的 terminate_handler 是抛出异常时生效的那个,不是实际调用 terminate 时生效的那个(尽管它们通常是相同的)。

在 C++11 中,这发生了变化,现在的标准规定使用的处理程序是调用 terminate 时的处理程序。此更改是错误完成的,很可能会在未来的草案中得到纠正。这是跟踪此问题的 LWG 问题:

http://cplusplus.github.com/LWG/lwg-active.html#2111

更新

在堪萨斯州 Lenexa 举行的 2015 年 Spring session 上,LWG 决定对现有行为进行标准化,并在新的 terminate_handler 生效时未指定如果 set_terminate 在期间调用堆栈展开。 IE。允许实现遵循 C++98/03 规则或 C++11 规则。

为了使您的代码可移植,如果您需要设置一个terminate_handler,请在程序启动时设置,以免抛出任何异常,并且不要养成调用set_terminate<的习惯 之后。

关于c++ - 用户提供的 terminate() 函数必须是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13104124/

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