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

Raf*_*cki 37 c++ language-lawyer c++11

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

引用N3242 18.5(第461页):

[[noreturn]] void quick_exit(int status) noexcept;
Run Code Online (Sandbox Code Playgroud)

效果:通过调用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_exitstd::abortstd::quick_exit注册的使用调用的函数std::at_quick_exit,并允许设置返回的状态?

引入此功能的理由是什么?

Han*_*ant 38

有一个很好的写了可在这里,我就总结一下吧.添加此功能是为了专门处理在使用线程时干净地结束程序的难度.本质上,退出是由高度异步的事件启动的,用户关闭用户界面,管理员关闭机器等等.这种情况发生时不考虑程序启动的线程状态,它们几乎总是处于高度不可预测的状态.

在理想的世界中,程序的main()函数要求线程退出,通常通过发出事件信号,等待线程结束然后退出main()以通过exit()进行干净关闭.这一理想却是非常难以实现.线程可以深埋在系统调用内部,比如等待一些I/O完成.或者它是在需要由正确顺序的另一个线程发信号通知的同步对象上阻塞.结果很少令人愉快,真正的程序经常在退出时陷入僵局.或者在关机顺序意外时崩溃.

这个问题有一个简单且非常诱人的解决方法:调用_exit()代替.Kaboom,程序结束,操作系统扫过弹片.但显然没有任何清理,有时会非常混乱,例如半写文件或不完整的dbase事务.

std :: quick_exit()提供了替代方案.与_exit()类似,但仍然可以选择执行某些代码,无论在at_quick_exit中注册了什么.

  • 此外,由于`abort`表示`SIGABRT`,调用`abort`通常会在*nix上的**核心转储**中或在Windows上的弹出窗口中产生(尽管这是可配置的)(例如_Program已停止工作,关闭/ Debug_).由于**意外情况而终止时只使用`abort`**并且你想要一个coredump/minidump来**诊断意外情况的原因**. (9认同)
  • 我一直希望我的眼睛能清楚地说明两个句子中真正重要的内容,这些句子大量使用反引号和粗体字。不,我需要新的眼睛。购物建议表示赞赏。 (2认同)

一二三*_*一二三 20

为理由std::quick_exit在讨论N1327N2440.之间的主要区别quick_exit,_Exit以及exit关注静态析构函数的处理和冲洗的关键信息,以稳定存储:

  • std::_Exit:不执行静态析构函数或刷新关键IO.
  • std::exit:执行静态析构函数并刷新关键IO.
  • std::quick_exit:不执行静态析构函数,但会刷新关键IO.

(如上所述,std::abort只是发送SIGABRT.)

  • 我没有在标准中看到std :: quick_exit刷新关键IO的任何证据.事实上,标准说"注意:标准文件缓冲区没有被刷新".您认为std :: quick_exit刷新关键IO的基础是什么,就此而言,"关键"IO的含义是什么? (5认同)
  • @KnowItAllWannabe:他将批判定义为"你对它注册一个`at_quick_exit`处理程序有足够的关注: (4认同)