2013-03-03 2 views
4

이 질문은 OpenKinect 라이브러리에만 국한되지 않지만이 문제를 보여주기 위해 생각해 볼 수있는 가장 좋은 예입니다.Pthreads를 사용하여 예외 잡기

OpenKinect 용 C++ Wrapper에서 무언가가 잘못 될 때마다 runtime_error 예외가 발생합니다. 이 예제는 libfreenect.hpp에 있습니다. 스레드는 클래스의 생성자에서 만들어집니다.

// Do not call directly, thread runs here 
void operator()() { 
    while(!m_stop) { 
     if(freenect_process_events(m_ctx) < 0) throw std::runtime_error("Cannot process freenect events"); 
    } 
} 

static void *pthread_callback(void *user_data) { 
    Freenect* freenect = static_cast<Freenect*>(user_data); 
    (*freenect)(); 
    return NULL; 
} 

제 질문은 간단히 : 이러한 오류를 어떻게 든 잡아서 처리 할 수 ​​있습니까?

일반적으로 예외를 처리하거나 코드를 다시 작성합니다. 예외로 인해 프로그램이 중단되는 것을 좋아하지 않으며 오류가 발생할 수 있음을 알고있는 경우이를 깨끗하게 처리하고 싶습니다. 필자가 다시 작성할 수없는 비슷한 일을하는 라이브러리가 있기 때문에이 질문을하는 이유는 무엇입니까?

+0

예외를 처리 할 수없는 이유는 무엇입니까? 왜 시도/캐치 라운드 '(* freenect)();' 요구? –

+0

요점은 이것이 라이브러리의 일부라는 것입니다. 이 소스는 오픈 소스이지만 변경 될 수는 있지만 변경할 수없는 다른 상황이 있습니다. 그래서 나는 단지 pthread를 사용하여 다른 쓰레드를 던질 수 있는지를 알고 싶었다. – AdmiralJonB

+1

직접 아니요, 아니요. 예외는 스택 기반 메커니즘이므로 스레드마다 다릅니다. 너가 pthreads 안에 그 (것)들을 붙 잡지 않으면, 실은 소리없이 종료 될 것이다. 다른 쓰레드에 예외를 전달하려면 catch {}에 스레드 간 통신이 필요합니다. –

답변

0

스레드의 책임 사항을 더 명확하게 정의해야합니다. 어떤 종류의 파이프 또는 동시 대기열을 통해 다른 스레드에 메시지를 전달한다고 추측합니다. 이 경우 메시지 클래스를 변경하여 예외 정보 (std :: exception_ptr)를 저장하십시오. 메시지의 데이터에 액세스 할 때 먼저 예외가 있는지 확인하십시오. 그렇다면 std :: rethrow_exception()을 호출하십시오.

비슷한 메커니즘이 std :: future();에서 사용됩니다. 약속 한 값을 get()하거나 다른 스레드에서 온 예외를 시도합니다. 실용적으로 보려면 std :: async() 예제를 검색하십시오.