ven*_*rty 5 c++ language-design exception signal-handling
我正在阅读Bjarne Stroustrup 的The Design and Evolution of C++。关于异常处理和异步信号,如下所述:
异常可以用来处理信号之类的事情吗?在大多数 C 环境中几乎可以肯定不是。问题是 C 使用了像 malloc 这样不可重入的函数。如果在 malloc 中间发生中断并导致异常,则无法阻止异常处理程序再次执行 malloc。
一个 C++ 实现,其中调用序列和整个运行时库是围绕可重入的要求设计的,这将使信号抛出异常成为可能
作者所说的“没有办法阻止异常处理程序再次执行malloc”是什么意思?使函数可重入如何使信号处理程序抛出异常成为可能?
在我看来,这部分对于当前的 C++ 来说并没有多大意义。
在 C++ 中,无法将异常用作信号,因为信号意味着执行处理程序,然后(可能)继续执行。
然而,C++ 异常不是这样工作的。一旦到达异常处理程序,堆栈就已经回滚,并且在处理后无法“继续”:无法到达抛出后的语句(或在发生异常的函数调用后)抛出)。
信号是异步的,但不会造成破坏,并且在信号可能后继续(即使当然必须注意信号处理程序中所做的事情),异常反而会破坏程序流程,并且不可能继续。
我想说这两个想法在逻辑层面上是不兼容的,并且库是否可重入并不重要。
可能在早期的 C++ 设计中,有一个针对异常的恢复选项......