有効なC ++プログラムを終了しないプログラムですか?


15

プログラムを終了する必要がありますか?言い換えれば、技術的に未定義の動作を永久に実行するプログラムですか?これは空のループについてではないことに注意してください。「もの」(つまり、観察可能な動作)を永遠に行うプログラムについて話す。

たとえば、次のようなもの:

int main()
{
    while (true)
    {
        try
        {
            get_input(); // calls IO
            process();
            put_output(); // calls IO, has observable behavior

            // never break, exit, terminate, etc
        } catch(...)
        {
            // ignore all exceptions
            // don't (re)throw
            // never go out of loop
        }
    }
}

経験的にすべての正気なコンパイラは、上記の種類のプログラムに対して期待されるコードを生成するため(これは他のUBのソースがないことを前提としています)、これはより学術的な質問です。そしてもちろん、終了しないプログラム(OS、埋め込み、サーバー)はたくさんあります。しかし、標準は時々風変わりなので、質問です。


接線:「アルゴリズム」の多くの(一部の?)定義では、アルゴリズムを終了する必要があります。つまり、終了しない一連の操作はアルゴリズムとは見なされません。


接線。停止問題は、任意のプログラムが入力に対して終了するかどうかを判別するアルゴリズムが存在できないことを示しています。ただし、この特定のプログラムの場合、メインから抜け出す原因となる分岐がないため、コンパイラーはプログラムが終了しないことを容易に判別できます。質問は言語弁護士なので、これは無関係です。


コメントは詳細な議論のためのものではありません。この会話はチャットに移動さました
Samuel Liew

回答:


15

C ++標準には、プログラムまたは特定のスレッドを終了する必要があるものはありません。これに最も近いものは[intro.progress] p1で

実装では、任意のスレッドが最終的に次のいずれかを実行すると想定します。

  • 終了、
  • ライブラリI / O関数を呼び出します。
  • 揮発性のglvalueを介してアクセスを実行する、または
  • 同期操作またはアトミック操作を実行します。

[  注:これは、終了が証明できない場合でも、空のループの削除などのコンパイラー変換を可能にすることを目的としています。—  エンドノート  ]

観察可能な動作がある限り、またはI / O操作または別のブロックライブラリ呼び出しでブロックされているすべての時間を費やす限り、これは当てはまりません。プログラムは有効です(すべての条件を満たす場合)その他の妥当性基準)。


「I / O操作または別のブロックライブラリ呼び出し」-標準はかなり明確で、I / O操作のみをリストしています。なぜ「または別のブロックライブラリコール」を追加するのですか?また、そのI / O操作は、以前の「いくつかの観察可能な動作」にすでに含まれています。
MSalters

1
@MSalters std::mutex::lock()は、同期操作であるライブラリ呼び出しで、4番目の項目に該当します。したがって、I / O呼び出しのみが言及されているとは限りません。
Igor Tandetnik

inputで動かなくなっても、まったく表示されない場合は、それが観測可能と見なされるかどうかは議論の余地があります。
ダニエルH

4

はい。から[intro.progress]

実装では、任意のスレッドが最終的に次のいずれかを実行すると想定します。

  • 終了、
  • ライブラリI / O関数を呼び出します。
  • 揮発性のglvalueを介してアクセスを実行する、または
  • 同期操作またはアトミック操作を実行します。

[ 注:これは、終了が証明できない場合でも、空のループの削除などのコンパイラー変換を可能にすることを目的としています。— エンドノート ]


プログラムがI / Oを実行することを説明する小さな説明が推奨されると思います。
KamilCuk

OPの例のget_inputand put_output関数が「ライブラリI / O関数を呼び出す」限り、プログラムは終了しなくても有効なはずですか?
一部のプログラマー、

@Someprogrammerdudeまたはアクセス、揮発性またはアトミック値、はい
Caleth

現在のメモリモデルがなかったときのc ++ 11以前の標準に興味があります。
bolov

1
compiler does not know-これは無関係です。コンパイラーは、言語レイヤーの観点から、知っていることも知らないこともあります。問題は、いずれにせよ、それが有効かどうかです。
KamilCuk、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.