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

C++ 信号如何与序列点相互作用?,c++,c,linux,signals,volatile,C++,C,Linux,Signals,Volatile,C89标准规定: 在序列点,易失性对象在先前 评估已完成,后续评估尚未进行。 C89标准还规定: 当抽象机器的处理因收到 信号,仅可显示前一序列点的对象值 依靠。 这些要求让我感到困惑,因为我无法想象它们会怎样 实际执行。我对x86-64只有初步的了解 汇编程序,但这是我脑子里想的。假设我们有 一个易失性结构,它有很多KB大。如果复制现有的 结构转换为C中的此易失性结构,则生成的机器代码可能 非常大。现在,让我们假设大量的机器代码是 执行时,系统上的某个shell在 过程,导致某些信号升高。

C89标准规定:

在序列点,易失性对象在先前
评估已完成,后续评估尚未进行。
C89标准还规定:

当抽象机器的处理因收到
信号,仅可显示前一序列点的对象值
依靠。
这些要求让我感到困惑,因为我无法想象它们会怎样 实际执行。我对x86-64只有初步的了解 汇编程序,但这是我脑子里想的。假设我们有 一个易失性结构,它有很多KB大。如果复制现有的 结构转换为C中的此易失性结构,则生成的机器代码可能 非常大。现在,让我们假设大量的机器代码是 执行时,系统上的某个shell在 过程,导致某些信号升高。我的理解(或者更确切地说是我的 猜测)该过程将在复制中期中断,导致 要求volatile被破坏,并导致结构从 任何信号处理程序的透视图

很明显,事情并不是这样的,但它们实际上是如何工作的呢 工作为了便于讨论,可以假设平台是x86-64 或者x86 Linux、Windows、OS X或其他一些常见的UNIX

在序列点上,易失性对象在之前 评估已完成,后续评估尚未进行

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

当抽象机器的处理因接收到 信号,仅可显示前一序列点的对象值 依靠

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

能够依赖以前的修改并不意味着你看不到后续修改的任何效果。值是稳定的,直到将来的某个代码位可以修改它们


因此,显而易见的实现不会违反这两个要求。

假设volatile结构在序列ponint A处设置为Alpha值,然后在序列B处设置为Beta值。现在,假设信号处理程序在A和B之间触发,在复制中期。该结构的大部分值来自Alpha,但它将部分填充来自Beta的值,因此不能依赖volatile结构的值,因此明显的实现不符合标准的要求。这仍然是我目前的理解。@patrick rutkowski当然,一旦你将某个值设置为一个新值,你就不能依靠它来获得以前的值。这不是“依赖”的意思!这只意味着你永远看不到之前的值。这并不意味着后续操作不会更改该值。如果您无法在门店之前看到结果,并且保证可以看到该门店的结果或之后发生的事情,那么您可以“依赖”门店运营。