【问题标题】:Why can't an infinite loop be eliminated?为什么不能消除无限循环?
【发布时间】:2015-03-25 22:59:27
【问题描述】:

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

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

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

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

  • 交互设备的输入和输出动态应以提示输出实际传递的方式发生 在程序等待输入之前。什么构成交互式 设备是实现定义的。

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

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

但是让我们采用如下的程序:

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

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

xorl    %eax, %eax
retq

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

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

【问题讨论】:

  • 如果你在一个废弃的旧巴士站等车(为了好玩),如果有一辆巴士停下来会不会很奇怪?
  • 您的问题是“为什么不这样做?”或“为什么不能这样做?” (或者两者都不是?)

标签: c++ halting-problem as-if


【解决方案1】:

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

实现可能假设任何线程最终都会做一个 以下内容:

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

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

【讨论】:

  • 可以,但不是必须的。
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 2012-11-12
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2013-03-01
相关资源
最近更新 更多