작업 스레드가 작업을 수행하기위한 조건에서 대기하는 종료 처리기 스레드가 있습니다. 신호는 작업자 스레드의 소멸자에서 수행됩니다.예외가 다른 스레드에서 catch 된 후에 스레드가 실행될 때 SIGABRT로 프로세스가 중단됩니다.
다음은 종료 처리기 스레드의 코드입니다.
void Class::TaskExitHandler::run() throw()
{
while(! isInterrupted()) {
_book->_eot_cond.wait(); // Waiting on this condition
{
CLASS_NAMESPACE::Guard<CLASS_NAMESPACE::FastLock> eguard(_book->_exitlist_lock);
list<TaskGroupExecutor*>::const_iterator itr = _book->_exited_tasks.begin();
for(; itr != _book->_exited_tasks.end(); itr++) {
(*itr)->join();
TRACER(TRC_DEBUG)<< "Deleting exited task:" << (*itr)->getLoc() << ":"
<< (*itr)->getTestID() << ":" << (*itr)->getReportName() << endl;
delete (*itr);
}
_book->_exited_tasks.clear();
}
_book->executeAny();
}
}
}
자, 관찰 된 것은 작업자 스레드 (하층에서 발생) 예외를 캐치 할 때,이 스레드가 계속되도록하고, 즉시 SIGABRT이다 종료 코드 (134)와 코어. 그래서 "던져()"를 사용하여 예외가 발생하지 않도록 지정이 실행() 함수는 스펙, 프레임 4에서 (예외가 발생 것 같다
#0 0x0000005555f49b4c in raise() from /lib64/libc.so.6
#1 0x0000005555f4b568 in abort() from /lib64/libc.so.6
#2 0x0000005555d848b4 in __gnu_cxx::__verbose_terminate_handler() from /usr/lib64/libstdc++.so.6
#3 0x0000005555d82210 in ??() from /usr/lib64/libstdc++.so.6
#4 0x0000005555d82258 in std::terminate() from /usr/lib64/libstdc++.so.6
#5 0x0000005555d82278 in ??() from /usr/lib64/libstdc++.so.6
#6 0x0000005555d81b18 in __cxa_call_unexpected() from /usr/lib64/libstdc++.so.6
#7 0x0000000120047898 in Class::TaskExitHandler::run()
#8 0x000000012001cd38 in commutil::ThreadBase::thread_proxy()
#9 0x0000005555c6e438 in start_thread() from /lib64/libpthread.so.0
#10 0x0000005555feed6c in __thread_start() from /lib64/libc.so.6
Backtrace stopped: frame did not save the PC
follows-로
는 스택 트레이스는). __cxa_call_unexpected()에 대한 다양한 참조에 따라 stacktrace는 "throw()"사양의 함수에서 예외가 발생할 때 중단 할 컴파일러의 일반적인 동작을 보여줍니다. 문제의 분석에 맞습니까?
테스트하려면이 메서드에서 try catch를 추가하고 예외 메시지를 인쇄하십시오. 이제 그 과정은 핵심이 아니 었습니다. 예외 메시지는 작업자 스레드가 포착 한 메시지와 동일합니다. 제 질문은이 스레드가 다른 스레드에 의해 잡힌 예외에 어떻게 접근 할 수 있습니까? 예외 처리와 관련된 일부 데이터 구조를 공유합니까?
이 부분을 밝혀주세요. 그것은 아주 수수께끼입니다 ..
주가 : - 스택 트레이스 당으로, call_unexpected이라고합니다() 실행 후 즉시 발생합니다. 그것은 어떻게 든 예외 스택이나 데이터가 공유된다는 나의 의구심을 강화시킵니다. 그러나이 행동에 대한 언급을 찾지 못했습니다.
'였습니다이 ("던져를 사용하여 예외가 발생하지 않도록 지정이 실행() 함수) "spec, 예외 (프레임 4에서) 발생 Heh! 당신이 일을 제대로 끝내고 싶다면, 모든 사양을 먼저 태우십시오! –
예! 불행하게도이 클래스는 일반적인 유틸리티 클래스를 상속해야하므로 제한이 있습니다. : – Vivek
아마 두 스레드가 모두 던져 졌을까요? 이상한 코드입니다 - 스레드 마이크로 관리처럼 보입니다. –