C89 标准规定:
At sequence points volatile objects are stable in the sense that previous
evaluations are complete and subsequent evaluations have not yet occurred.
C89 标准还规定:
When the processing of the abstract machine is interrupted by receipt of a
signal, only the values of objects as of the previous sequence point may be
relied on.
这些要求让我很困惑,因为我无法想象他们会如何
实际落实。我对x86-64只有粗浅的了解
汇编程序,但这就是我脑子里想到的。假设我们有
一个易失性结构,它有很多千字节大。如果您复制现有的
struct 到 C 中的这个易失性结构中,那么生成的机器代码可能是
非常大。现在,假设这么大量的机器代码是
执行,系统上的某些 shell 执行“kill”命令
过程,导致一些信号的产生。我的理解(或者说我的理解)
猜测)是该过程会在复制过程中被中断,导致
破坏 volatility 的要求,并导致结构畸形
任何信号处理程序的视角。
显然事情实际上并不是这样的,但是它们实际上是如何工作的
工作?为了便于讨论,请随意假设平台是 x86-64
或 x86 Linux、Windows、OS X 或其他一些常见的 UNIX。
在序列点,易失性对象在之前的意义上是稳定的
评估已完成,后续评估尚未进行。
这不会被违反,因为中断不是序列点。该规则仅描述“在序列点”发生的情况。如果我们在序列点 A 之后和序列点 B 完成之前被中断,则我们不在“处于”序列点 A 或序列点 B。
当抽象机的处理因接收到一个中断而中断时
信号,只有前一个序列点的对象值可以是
依靠。
这不会被违反。如果我们在序列点 A 和 B 之间中断,例如在中间副本中,则可以依赖在序列点 A 所做的所有更改。他们完成了。
能够依赖先前的修改并不意味着您不会看到后续修改的任何效果。值是稳定的,直到将来的某些代码可以修改它们为止。
因此,明显的实现并不违反任何一个要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)