gpt4 book ai didi

c++ - 信号如何与序列点相互作用?

转载 作者:IT王子 更新时间:2023-10-29 00:35:23 27 4
gpt4 key购买 nike

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只有初步的了解汇编程序,但这就是我脑海中的想法。假设我们有一个 volatile 结构,它有好几千字节大。如果您复制现有的struct 到 C 中的这个 volatile struct 中,那么生成的机器代码可能非常大。现在,假设这些大量的机器代码是执行,并且系统上的某些 shell 执行“kill”命令过程,导致一些信号的上升。我的理解(或者更确切地说,我的猜测)是该过程会在复制中途中断,从而导致对 volatile 的要求被打破,并导致结构从任何信号处理程序的视角。

显然事情实际上并不是这样运作的,但是它们实际上是如何运作的工作?为了争论,请随意假设平台是 x86-64或 x86 Linux、Windows、OS X 或其他一些常见的 UNIX。

最佳答案

At sequence points volatile objects are stable in the sense that previous evaluations are complete and subsequent evaluations have not yet occurred.

这不会被违反,因为中断不是序列点。此规则仅描述“在序列点”发生的情况。如果我们在序列点 A 之后和序列点 B 完成之前被打断,我们就不会“在”序列点 A 或序列点 B。

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.

这不会被违反。如果我们在序列点 A 和 B 之间被打断,比如在中间拷贝中,则可以依赖在序列点 A 所做的所有更改。他们完成了。

能够依赖先前的修改并不意味着您不会看到后续修改的任何效果。在未来的一些代码可以修改它们之前,值是稳定的。

所以显而易见的实现并没有违反任何一个要求。

关于c++ - 信号如何与序列点相互作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24975051/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com