2014-10-04 3 views
0

스레드의 예외가 발생하는 경우 해당 예외가 해당 스레드에서 발견되지 않으면 주 스레드가 영향을 받습니까?스레드의 예외

왜? 늘어나는만큼 내가 기억할 수있는, 예외는 스택을 기반으로하므로 하나가 발생하면 스택 unwinds 오른쪽? 그러나 스레드에 자체 스택이있는 경우 왜 주 스레드가 영향을 받습니까?

예 :

#include <iostream> 
#include <thread> 
#include <chrono> 

int main() 
{ 
    std::thread([]{ 
     throw std::runtime_error("HELLO"); 
    }).detach(); 

    std::this_thread::sleep_for(std::chrono::seconds(5)); 
} 

이 스레드가 분리된다. 주 프로그램이 왜 충돌하는지 이해할 수 없습니다. 나에게 그것은 자식 프로세스가 충돌하여 부모가 충돌하는 것과 같습니다.

: 누군가 스레드의 예외 작동 방식을 설명 할 수 있습니까?

+0

그러나 주 스레드에서 걸릴 수 없습니다. 자식 스레드 자체에서만. 그렇다면 왜 메인 쓰레드에 영향을 주어야합니까? – Brandon

+0

분리가 실행될 때 스레드가 예외를 throw 할 수 있습니까? –

+0

@VladfromMoscow 아니요. 나는 그것을 던지기 전에 5 초 동안 자게했다. 분리 할 충분한 시간을줍니다. 주 스레드를 10 초 동안 잠자기 상태로 만들었습니다. 그것은 실제로 무엇이든 충돌합니다. 동의 버튼 타이머가 냉각 될 때까지 다른 사람이 없다면 Dai의 답변을 수락 할 것입니다. 말된다. – Brandon

답변

2

MSDN (http://msdn.microsoft.com/en-us/library/ac9f67ah.aspx)에 따르면 적절한 catch 처리기가 발견되지 않으면 terminate 함수가 호출됩니다. terminate은 기본적으로 C 런타임 함수 abort을 호출하지만 필요한 경우이 값을 set_terminate을 호출하여 무시할 수 있습니다.

terminate이 보조 스레드에서 호출되어 프로그램이 종료됩니다. 즉, 주/상위/항목 스레드가 즉시 중지되고 프로세스가 OS에 의해 종료됩니다.

스레드를 프로세스와 비교하는 것은 공정하지 않습니다. 프로세스는 서로 메모리로부터 격리되지만 스레드는 그렇지 않습니다. 프로그램이 예기치 않은 상태 또는 바람직하지 않은 상태에있는 경우 예외가 발생할 수 있습니다. 즉 프로그램의 메모리 공간에있는 데이터가 손상 될 수 있으며 프로그램에서 예외를 적절하게 처리하고 그렇지 않은 경우 종료합니다 (손상된 쓰기 위험을 피하기 위해). 데이터가 디스크 (매우 나쁜 일 (TM)입니다.) 이것은 주 스레드가 계속 실행되면 손상되었거나 유효하지 않을 수 있기 때문에 어떤 스레드가 예외를 처리하지 않는 경우 프로그램이있는 뒤에있는 동기 부여에 대해 설명합니다 (abort). 당신은 데이터를 원하지 않는.

이이 동일 것과 같이 다른 platforms like C# (대신 terminate, 그것은이 AppDomain.UnhandledException을, 그리고 복구 할 수 제외) 자바는 주목할만한 예외가 (웃기려는 의도 없음) 비록, 어디 스레드 종료되지만 프로세스는 계속 실행됩니다. ose (경고 : 추측!) 메모리 자체가 손상되지 않기 때문에 Java의 경우 응용 프로그램 객체 상태가 손상 될 수있는 경우에도 프로세스를 계속 진행하는 데 큰 어려움이 없습니다.

관련 문제