C++11介绍了一种完成程序执行的新方法--std::quick_exit
。
引用N3242 18.5 (第461页):
[noexcept] void quick_exit(int状态)int,除; 效果:通过调用
at_quick_exit
注册的函数按其注册的相反顺序调用,除非函数在注册时已被调用的任何以前注册的函数之后被调用。对象不应由于调用quick_exit
而销毁。如果控件保留由quick_exit
调用的注册函数,因为该函数没有为抛出的异常提供处理程序,则将调用terminate()
。注意:at_quick_exit
可以从与注册线程不同的线程调用注册函数,因此注册函数不应该依赖具有线程存储持续时间的对象的标识。-在调用注册函数后,quick_exit
应调用_Exit(status)
。注意:标准文件缓冲区不被刷新。见: ISO C 7.20.4.4。-尾注
由于std::abort(void)
和std::_Exit(int status)
的定义仅在将状态传递给父进程的能力上有所不同,这就提出了我的问题。
这是否意味着std::quick_exit
和std::abort
在语义上的唯一区别是std::quick_exit
调用使用std::at_quick_exit
注册的函数并允许设置返回的状态?
引入这一职能的理由是什么?
发布于 2012-03-18 14:49:58
有一个很好的可在这里找到,我来总结一下。添加此功能是为了专门处理在使用线程时彻底结束程序的困难。本质上,退出是由一个高度异步的事件启动的,用户关闭用户界面,管理员关闭机器等等。这种情况不考虑程序启动的线程的状态,它们几乎总是处于高度不可预测的状态。
在理想情况下,程序的main()函数要求线程退出,通常是通过给事件发送信号,等待线程结束,然后通过exit()退出main()以实现干净的关闭。然而,这一理想很难实现。线程可能被深埋在系统调用中,例如,等待某个I/O完成。或者它阻塞了需要由另一个线程按正确顺序发出信号的同步对象。结果很少令人愉快,真正的程序往往在退出时陷入僵局。或当关机命令意外发生时崩溃。
对于这个问题,有一个简单而诱人的解决方法:调用_exit()。卡波姆,程序结束了,操作系统清除了弹片。但显然,没有任何清理,非常混乱,有时与工件,如半书面文件或不完整的dbase事务。
std::quick_exit()提供了替代方案。类似于_exit(),但仍然有执行某些代码的选项,无论在at_quick_exit中注册了什么代码。
发布于 2012-03-18 13:37:44
发布于 2012-03-18 13:14:08
std::abort
将终止您的应用程序,而不调用使用“at_exit/at_exit_exit”注册的任何函数。另一方面,正如您所指出的,std::quick_exit
将调用使用std::at_quick_exit
注册的函数。
std::abort
通常会中止您的应用程序,当出现一些异常情况时,应该调用它,并且您的应用程序必须在不执行任何清理的情况下关闭。来自std::abort
文档:
除非SIGABRT被传递给信号的信号处理程序捕获,而且处理程序不返回,否则会导致异常的程序终止。
当您想要执行一些清理时,std::quick_exit
将得到更多的批准。最后一个函数还允许您优雅地停止应用程序,因为它最终调用了std::_Exit
,而不是发出像std::abort
这样的信号(它发出SIGABRT信号,使应用程序异常停止)。
std::exit
允许您优雅地退出应用程序,同时仍然清理自动、线程本地和静态变量。std::quick_exit
没有。这就是为什么它的名字中有一个"quick_“,因为它跳过了清理阶段,所以速度更快。
因此,这两种功能之间存在着实际的语义差异。一个不正常地停止应用程序,另一个执行优雅的退出,允许您进行一些清理。
https://stackoverflow.com/questions/9758495
复制相似问题