1

这些规则涵盖了“as-if”规则:

对一致性实现的最低要求是:

  • 对 volatile 对象的访问严格按照抽象机的规则进行评估。

  • 在程序终止时,写入文件的所有数据应与根据抽象语义执行程序可能产生的结果之一相同。

  • 交互式设备的输入和输出动态应该以这样一种方式发生,即在程序等待输入之前实际交付提示输出。构成交互式设备的内容是实现定义的。

这些统称为程序的可观察行为。

...访问由 volatile glvalue (3.10) 指定的对象、修改对象、调用库 I/O 函数或调用执行任何这些操作的函数都是副作用,它们是状态的变化执行环境。...

但让我们采用如下程序:

while (1) { }
// or
for (;;) { }

事实是没有对象或对函数的调用,因此没有副作用,因此没有“执行环境状态的变化”。是什么阻止编译器将此代码编译为

xorl    %eax, %eax
retq

这一切都是不确定的吗?无限循环本质上是“这是一个标签,一遍又一遍地跳到它”,并将一直持续到计算机关闭。代码没有做任何有趣的事情,没有计算,没有 I/O 输出等。

在内核代码中,无限循环变得有趣。但在用户空间代码中,无限循环通常是程序编写不佳的标志。那么我的逻辑有什么缺陷呢?

4

1 回答 1

3

它可以,因为 [intro.multithread]/p27(引用 N4140;这是 N3337 中的 p24):

实现可能假设任何线程最终都会执行以下操作之一:

  • 终止,
  • 调用库 I/O 函数,
  • 访问或修改 volatile 对象,或
  • 执行同步操作或原子操作。

空无限循环是 C++11 及更高版本中的 UB。

于 2015-03-25T23:12:47.037 回答