【问题标题】:How do signals interact with sequence points?信号如何与序列点交互?
【发布时间】:2014-07-26 20:02:17
【问题描述】:

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 中的 volatile 结构中,那么生成的机器代码可能 非常大。现在,假设这个大量的机器码是 执行,系统上的某些 shell 在 过程,引起一些信号的升高。我的理解(或者更确切地说是我的 猜测)是该过程将在复制中间中断,导致 对 volatile 的要求被破坏,并导致结构从 任何信号处理程序的视角。

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

【问题讨论】:

    标签: c++ c linux signals volatile


    【解决方案1】:

    在序列点上,易失性对象在之前的意义上是稳定的 评估已完成,后续评估尚未进行。

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

    当抽象机的处理因收到一个 信号,只有前一个序列点的对象的值可能是 依靠。

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

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

    所以明显的实现不会违反任何一个要求。

    【讨论】:

    • 假设 volatile 结构在序列节点 A 处设置为 Alpha 值,然后在 B 处设置为 Beta 值。现在假设信号处理程序在 A 和 B 之间触发,在中间复制。该结构将主要具有来自 Alpha 的值,但将部分填充来自 Beta 的值,因此 volatile 结构的值不能被依赖,因此明显的实现不符合标准的要求.这仍然是我目前的理解。
    • @patrick-rutkowski 当然,一旦将其设置为新值,您就不能依赖某些东西来获得以前的值。这不是“依赖”的意思!这只是意味着您永远无法看到之前的值。这并不意味着后续操作不会更改该值。如果您无法在该商店之前看到结果,并且保证看到该商店的结果或之后发生的事情,您可以“依赖”商店操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多