C++ 사양은 C++ 사양에 포함 된 항목 만 정의 할 수 있습니다. C++ 사양은 정의한 가상 컴퓨터의 동작을 정의합니다. 그리고 어떤 일이 일어날 수 있다고 정의하지 않는다면, C++의 동작은 말할 수없는 무언가가 일어날 수 있다는 것을 분명히 정의하지 않습니다.
C++ 사양에 따르면 스레드는 주 기능에서 복귀하고 주 기능을 통해 예외를 던지고 직접 프로세스 종료 (std::terminate
또는 이와 유사한 기능과 같이)하는 세 가지 방법으로 종료 할 수 있습니다. 즉, C++ 스레드 은 다른 방법으로는을 종료 할 수 없습니다. 표준 C++에는 ExitThread
함수가 없습니다. 마찬가지로 std::thread
은 외부 또는 내부에서 스레드를 죽일 수 없습니다.
따라서 C++에서 발생할 수없는 문제는 정의되지 않은 것입니다. 나는 그것이 "정의되지 않은 행동"이 아닐 것이라고 생각한다. C++ 11이 실제로 스레드 상호 작용이 어떻게 작동하는지 알기 전에 스레딩 (threading)이 있었던 것은 어둡습니다.
"신호"는 무엇이든지간에 마찬가지입니다. C++ 사양은 함수가 종료 될 수 있다고 말하지 않습니다. 여기는 용 이예요.
longjmp
의 경우는 동작이 longjmp
입니다. longjmp
을 사용하여 함수를 종료하면 throw
과 catch
을 사용한 것처럼 함수가 완료되지 않습니다. 그리고 C++에서 객체는 생성자가 완성되었을 때만 생성됩니다. 따라서 개체의 초기화가 완료되지 않고 초기화되지 않은 것입니다.
나는 C++ (11) 당신이 얻을 때 늘어나는만큼, throw
/catch
longjmp
/setjmp
와 동일시 할 수있는 제안 강하게 않습니다 (longjmp
의 행동 C++ 참조)하지만, ISO C 규격이없는 정의되지 않은 동작 :
§18.10 [support.runtime] p4:
함수 서명하는 longjmp는 (되는 jmp_buf jbuf, INT 발)이 국제 표준에보다 제한된 동작을 가지고있다. setjmp와 longjmp를 catch와 throw로 대체하면 모든 자동 객체에 대해 사소한 소멸자를 호출하지 않으면 setjmp/longjmp 호출 쌍이 정의되지 않은 동작을합니다.
나는 이것이 구체적으로 밝혀지지 않았다고 생각하지 않습니다. 멋있고 깔끔하게 배치되지는 않지만 모든 조각이 있습니다.
C++은 신호와 관련하여 _anything_을 정의합니까? 아니면'longjmp'? 스레드 이탈은 상황을 바꿀 수 있습니다. –
표준에 따라 적절히 지정되지 않았다는 구체적인 시나리오가 있습니까? –
@Kerrek : 연결된 질문입니다. : P – Xeo