2017-09-29 113 views
0

我修改,並從該post測試程序:如何理解pthread_cancel導致「終止調用沒有活動異常」?

#include <unistd.h> 
#include <pthread.h> 
#include <iostream> 
using namespace std; 
struct Sleepy 
{ 
    ~Sleepy() 
    { 
    cerr<<"...zZzZz..."<<endl; 
    sleep(999); 
    } 
}; 

void* sleepyThread(void*) 
{  
    Sleepy f; 
    cerr<<"Fall asleep...\n"; 
} 

int main() 
{ 
    pthread_t thread; 
    int id=pthread_create(&thread,NULL,&sleepyThread,NULL); 
    sleep(1); //Give the new thread time to get to the sleeping part... 
    cerr<<"lets try to cancel it..."<<endl; 
    pthread_cancel(thread); 
    pthread_join(thread,NULL); 
    cerr<<"All is done now..."<<endl; 
} 

運行它會導致核心轉儲:

...... 
terminate called without an active exception 
Aborted (core dumped) 

的堆棧跟蹤是這樣的:

(gdb) bt 
#0 0x00007f30325528c0 in raise() from /usr/lib/libc.so.6 
#1 0x00007f3032553f72 in abort() from /usr/lib/libc.so.6 
#2 0x00007f3032e80035 in __gnu_cxx::__verbose_terminate_handler() 
    at /build/gcc/src/gcc/libstdc++-v3/libsupc++/vterminate.cc:95 
#3 0x00007f3032e7dc46 in __cxxabiv1::__terminate (handler=<optimized out>) 
    at /build/gcc/src/gcc/libstdc++-v3/libsupc++/eh_terminate.cc:47 
#4 0x00007f3032e7dc91 in std::terminate() at /build/gcc/src/gcc/libstdc++-v3/libsupc++/eh_terminate.cc:57 
#5 0x00007f3032e7d7e0 in __cxxabiv1::__gxx_personality_v0 (version=<optimized out>, actions=<optimized out>, 
    exception_class=0, ue_header=<optimized out>, context=<optimized out>) 
    at /build/gcc/src/gcc/libstdc++-v3/libsupc++/eh_personality.cc:670 
#6 0x00007f30328d4fb5 in _Unwind_ForcedUnwind_Phase2 ([email protected]=0x7f303251ed70, 
    [email protected]=0x7f303251d750) at /build/gcc/src/gcc/libgcc/unwind.inc:175 
#7 0x00007f30328d5575 in _Unwind_ForcedUnwind (exc=0x7f303251ed70, stop=0x7f30331861b0 <unwind_stop>, 
    stop_argument=<optimized out>) at /build/gcc/src/gcc/libgcc/unwind.inc:207 
#8 0x00007f3033186351 in __pthread_unwind() from /usr/lib/libpthread.so.0 
#9 0x00007f303317b7d2 in sigcancel_handler() from /usr/lib/libpthread.so.0 
#10 <signal handler called> 
#11 0x00007f30325dabcd in nanosleep() from /usr/lib/libc.so.6 
#12 0x00007f30325dab0a in sleep() from /usr/lib/libc.so.6 
#13 0x0000560ce9b04d92 in Sleepy::~Sleepy (this=0x7f303251dee7, __in_chrg=<optimized out>) at sleepy.cpp:10 
#14 0x0000560ce9b04bf5 in sleepyThread() at sleepy.cpp:16 
#15 0x00007f303317d049 in start_thread() from /usr/lib/libpthread.so.0 
#16 0x00007f303260cf0f in clone() from /usr/lib/libc.so.6 

我可以」完全理解post中寫的原因。根據我的理解,應該是在__pthread_unwind()這會導致stack unwinding會使本地變量Sleepy f回收,並且這會觸發Sleepy f的析構函數再次被調用。這似乎不合理。

我的理解是否正確?誰能給出更詳細的解釋?

+1

從鏈接的文章:「我們都知道,我們不應該扔裏面析構函數例外,因爲析構函數很可能在處理異常時調用,2個例外在同一時間被稱爲導致C++運行時中止「,」和析構函數內部的睡眠函數是一個取消點,並且當調用pthread_cancel時,實際發生的是拋出匿名異常來執行堆棧解除。我認爲這很清楚。 –

回答

相關問題