如中所述http://en.cppreference.com/w/cpp/error/terminate 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
在导致此终止调用的线程上下文中调用?
Q1
Yes, std::terminate
可以同时调用。
Q2
该标准表示这是未定义的行为terminate_handler
不要“终止程序的执行而不返回调用者”。在我熟悉的实现中,如果terminate_handler
尝试正常或异常地返回,abort()
将被调用。
Q3
设定的功能为std::terminate
是全局的,而不是线程局部的。因此一个线程可以影响另一个线程。
在 C++98/03 中,terminate_handler
使用时terminate
由于未捕获的异常而被调用的是抛出异常时有效的异常,而不是抛出异常时有效的异常terminate
实际上被调用(尽管它们通常是相同的)。
在 C++11 中,这一点发生了变化,现在的标准表示使用的处理程序是当时就位的处理程序terminate
叫做。这一更改是错误的,很可能会在未来的草案中得到纠正。以下是跟踪此问题的 LWG 问题:
http://cplusplus.github.com/LWG/lwg-active.html#2111 http://cplusplus.github.com/LWG/lwg-active.html#2111
Update
在堪萨斯州莱内克萨举行的 2015 年春季会议上,LWG 决定标准化现有行为,并在新行为出现时未指定该行为。terminate_handler
生效如果set_terminate
在堆栈展开期间调用。 IE。实现可以遵循 C++98/03 规则或 C++11 规则。
为了使您的代码可移植,如果您需要设置terminate_handler
,在程序启动期间,在抛出任何异常之前执行此操作,并且不要养成调用的习惯set_terminate
在那之后。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)