Raf*_*cki 37 c++ language-lawyer c++11
C++ 11引入了一种完成程序执行的新方法std::quick_exit.
引用N3242 18.5(第461页):
Run Code Online (Sandbox Code Playgroud)[[noreturn]] void quick_exit(int status) noexcept;效果:通过调用
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,并允许设置返回的状态?
引入此功能的理由是什么?
Han*_*ant 38
有一个很好的写了可在这里,我就总结一下吧.添加此功能是为了专门处理在使用线程时干净地结束程序的难度.本质上,退出是由高度异步的事件启动的,用户关闭用户界面,管理员关闭机器等等.这种情况发生时不考虑程序启动的线程状态,它们几乎总是处于高度不可预测的状态.
在理想的世界中,程序的main()函数要求线程退出,通常通过发出事件信号,等待线程结束然后退出main()以通过exit()进行干净关闭.这一理想却是非常难以实现.线程可以深埋在系统调用内部,比如等待一些I/O完成.或者它是在需要由正确顺序的另一个线程发信号通知的同步对象上阻塞.结果很少令人愉快,真正的程序经常在退出时陷入僵局.或者在关机顺序意外时崩溃.
这个问题有一个简单且非常诱人的解决方法:调用_exit()代替.Kaboom,程序结束,操作系统扫过弹片.但显然没有任何清理,有时会非常混乱,例如半写文件或不完整的dbase事务.
std :: quick_exit()提供了替代方案.与_exit()类似,但仍然可以选择执行某些代码,无论在at_quick_exit中注册了什么.
一二三*_*一二三 20
为理由std::quick_exit在讨论N1327和N2440.之间的主要区别quick_exit,_Exit以及exit关注静态析构函数的处理和冲洗的关键信息,以稳定存储:
std::_Exit:不执行静态析构函数或刷新关键IO.std::exit:执行静态析构函数并刷新关键IO.std::quick_exit:不执行静态析构函数,但会刷新关键IO.(如上所述,std::abort只是发送SIGABRT.)