유효한 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()는 네 번째 글 머리 기호에 해당하는 동기화 작업 인 라이브러리 호출입니다. 따라서 I / O 호출 만 언급되는 것은 사실이 아닙니다.
Igor Tandetnik

input에 붙어 있지만 결코 얻지 못하면 관찰 가능한 것으로 간주되는지 여부는 논쟁의 여지가 있습니다.
Daniel H

4

예. 에서[intro.progress]

구현시 모든 스레드가 결국 다음 중 하나를 수행한다고 가정 할 수 있습니다.

  • 끝내다,
  • 라이브러리 I / O 함수를 호출하고
  • 휘발성 glvalue를 통해 액세스를 수행하거나
  • 동기화 작업 또는 원자 작업을 수행합니다.

[ 참고 : 이것은 종료를 증명할 수없는 경우에도 빈 루프 제거와 같은 컴파일러 변환을 허용하기위한 것입니다. — 끝 참고 ]


프로그램이 I / O를 수행한다고 언급하는 약간의 설명이 바람직하다고 생각합니다.
KamilCuk

따라서 OPs 예제 의 get_inputput_output함수가 "라이브러리 I / O 함수를 호출"하는 한 프로그램이 종료되지 않더라도 유효해야합니까?
일부 프로그래머 친구

@Someprogrammerdude 또는 휘발성 또는 원자 가치에 액세스, 예
Caleth

현재 메모리 모델이 없었던 pre c ++ 11 표준에 대해 궁금합니다.
bolov

1
compiler does not know-관련이 없습니다. 컴파일러는 언어 계층의 관점에서 알거나 알지 못할 수 있습니다. 문제는 어쨌든 그것이 유효한지 여부입니다.
KamilCuk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.