c++ - 如何理解 pthread_cancel 原因 "terminate called without an active exception"?

标签 c++ exception pthreads raii

我从这个 post 修改和测试程序:

#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 (exc=exc@entry=0x7f303251ed70,
    context=context@entry=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 的析构函数再次调用。似乎不合理。

我的理解对吗?谁能给出更详细的解释?

最佳答案

不确定它是否适用于您的情况,但在 C++11 中,pthread_cancel 将无法正常工作。

参见示例

https://gcc.gnu.org/ml/gcc-help/2015-08/msg00040.html

关于c++ - 如何理解 pthread_cancel 原因 "terminate called without an active exception"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46486194/

相关文章:

c++ - Boost property_tree错误:在.ini文件中获取元素时,数据转换为 “j”类型失败

c++ - JS_NewContext 中的 JSAPI 段错误

c++ - xll函数的线程安全

linux - 线程pthread的复用

c - 使用互斥体设置 pthread 的优先级

c++ - 正在获取 C++11 中 std::vector::operator[](size) 未定义行为的地址

java - 自定义异常不断给我 "Exception: Unknown exception"

exception - Installshield:EnumServicesStatus 抛出异常问题

未找到 Java 结果集列 '<column_name>'

c++ - C++中线程读取文件