c++ std :: quick_exit和std :: abort和为什么std :: quick_exit需要有什么区别?

C 11引入了一种新的完成程序执行的方法std :: quick_exit。

引用N3242 18.5(第461页):

06000

Effects: Functions registered by calls to at_quick_exit are called
in the reverse order of their registration, except that a function
shall be called after any previously registered functions that had
already been called at the time it was registered. Objects shall not
be destroyed as a result of calling quick_exit. If control leaves a
registered function called by quick_exit because the function does not
provide a handler for a thrown exception, terminate() shall be called.
[ Note: at_quick_exit may call a registered function from a different
thread than the one that registered it, so registered functions should
not rely on the identity of objects with thread storage duration. —
end note ] After calling registered functions, quick_exit shall call
_Exit(status). [ Note: The standard file buffers are not flushed. See: ISO C 7.20.4.4. — end note ]

因为std :: abort(void)和std :: _ Exit(int status)的定义不同之处仅在于将状态传递给父进程的能力,所以提出了我的问题。

是否意味着std :: quick_exit和std :: abort之间的语义的唯一区别是std :: quick_exit调用使用std :: at_quick_exit注册的函数并允许设置返回的状态?

引入这个函数的理由是什么?

最佳答案
有一个很好的写available here,我只是总结它。此功能被添加以专门处理在使用线程时干净地结束程序的难度。本质上,退出是由高度异步的事件开始的,用户关闭用户界面,管理员关闭机器等。这发生不考虑程序启动的线程的状态,它们几乎总是处于高度不可预测的状态。

在理想情况下,程序的main()函数通常通过发出信号通知事件,等待线程结束,然后退出main()以通过exit()进行干净关闭,从而请求线程退出。然而,这种理想很难实现。线程可以埋在系统调用的深处,比如说,等待一些I / O完成。或者它阻塞在需要由正确顺序的另一个线程信号通知的同步对象。结果很少愉快,真正的程序经常在退出时死锁。或当停机命令意外时崩溃。

这个问题有一个简单而非常诱人的解决方法:call _exit()。 Kaboom,程序结束后,操作系统扫描弹片。但是显然没有任何清理,有时候会出现像半文件或不完整的dbase事务那样的工件。

std :: quick_exit()提供了替代方法。类似于_exit(),但仍然有执行一些代码的选项,无论是在at_quick_exit注册。

转载注明原文:c++ std :: quick_exit和std :: abort和为什么std :: quick_exit需要有什么区别? - 代码日志