pthread_exit
과 pthread_cancel
을 모두 이해할 경우 대상 스레드의 관련 스택 프레임에서 "forced unwind"라는 예외와 비슷한 결과가 발생합니다. 이것은 특정 스레드 정리를 수행하기 위해 발견 될 수 있지만 다시 throw되어야합니다. 그렇지 않으면 다시 throw하지 않는 catch 블록의 끝에 암시적인 abort()
이 표시됩니다.처리되지 않은 강제 unwind cause abort
pthread_cancel
의 경우 스레드의 취소 상태 및 유형에 따라 신호가 수신 될 때 즉시 또는 취소 지점에 다음 항목이 생기거나 다음에 신호가 차단 해제 될 때 발생합니다.
pthread_exit
의 경우 호출 스레드가 즉시 강제 unwind됩니다.
좋아요. 이 "예외"는 스레드를 죽이는 과정의 정상적인 부분입니다. 그렇다면 다시 던지더라도 std::terminate()
이 호출되어 전체 응용 프로그램을 중단하는 이유는 무엇입니까?
나는 예외를 몇 번 붙잡고 다시 던지고 있음에 유의하십시오.
내 SIGTERM
신호 처리기를 호출하고 있습니다. g ++ 4.3.2로 컴파일 된 내 장난감 테스트 코드에서이 작업은 스레드가 signal(SIGTERM, handler_that_calls_pthread_exit)
으로 실행 된 다음 TERM
신호가 도착할 때까지 단단한 while
루프에 앉아 있습니다. 그러나 실제 응용 프로그램에서는 작동하지 않습니다.
관련 스택 프레임 :
(gdb) where
#0 0x0000003425c30265 in raise() from /lib64/libc.so.6
#1 0x0000003425c31d10 in abort() from /lib64/libc.so.6
#2 0x00000000012b7740 in sv_bsd_terminate() at exception_handlers.cpp:38
#3 0x00002aef65983aa6 in __cxxabiv1::__terminate (handler=0x518)
at /view/ken_gcc_4.3/vobs/Compiler/gcc/libstdc++-v3/libsupc++/eh_terminate.cc:43
#4 0x00002aef65983ad3 in std::terminate()
at /view/ken_gcc_4.3/vobs/Compiler/gcc/libstdc++-v3/libsupc++/eh_terminate.cc:53
#5 0x00002aef65983a5a in __cxxabiv1::__gxx_personality_v0 (
version=<value optimized out>, actions=<value optimized out>,
exception_class=<value optimized out>, ue_header=0x645bcd80,
context=0x645bb940)
at /view/ken_gcc_4.3/vobs/Compiler/gcc/libstdc++-v3/libsupc++/eh_personality.cc:657
#6 0x00002aef6524d68c in _Unwind_ForcedUnwind_Phase2 (exc=0x645bcd80,
context=0x645bb940)
at /view/ken_gcc_4.3/vobs/Compiler/gcc/libgcc/../gcc/unwind.inc:180
#7 0x00002aef6524d723 in _Unwind_ForcedUnwind (exc=0x645bcd80,
stop=<value optimized out>, stop_argument=0x645bc1a0)
at /view/ken_gcc_4.3/vobs/Compiler/gcc/libgcc/../gcc/unwind.inc:212
#8 0x000000342640cf80 in __pthread_unwind() from /lib64/libpthread.so.0
#9 0x00000034264077a5 in pthread_exit() from /lib64/libpthread.so.0
#10 0x0000000000f0d959 in threadHandleTerm (sig=<value optimized out>)
at osiThreadLauncherLinux.cpp:46
#11 <signal handler called>
감사합니다!
에릭 내 SIGTERM 신호 핸들러에서 는 pthread_exit를 호출하고있어 것 또한