为什么pthreadexit抛出被省略号捕获的东西

why does pthread_exit throw something caught by ellipsis?

本文关键字:省略号 pthreadexit 为什么      更新时间:2023-10-16

如果pthread_create调用的函数具有以下结构

try{
  ...code....
  pthread_detach(pthread_self());
  pthread_exit(NULL);
}catch(...){
  std::cout<<"I am here"<<std::endl;
}

为什么在执行pthread_exit时调用省略号的异常处理程序?(注意,例如,std::exception没有抛出)

至少在GCC中,pthread_exit可能会引发___forced_unvolve异常,该异常用于在线程退出期间展开堆栈。它不是从std::exception继承的,因此不能被捕获为一个。如果您确实捕捉到了该异常,请确保重新throw它,以便它可以完成它的工作:

try {
...
} catch (abi::___forced_unwind&) {
    throw;
} catch (...) {
    // whatever
}

引发异常的原因是pthread_exit被指定为永远不会返回。让它抛出可以保证清理堆栈分配的变量,并且在它的位置之后不会执行代码(除非你捕捉到展开异常…)。然而,这是不可移植的,例如Clang使用了一种完全不同的机制。

顺便说一句,这是catch (...)习语弊大于利的又一个例子。它有时被用来"稳定"抛出未知异常的代码。但这只会将损坏的可见性推迟到以后的时间和地点,从而无法确定问题的真正根源。在这种情况下,唯一合理的做法是进行最小限度的清理,可能是记录,然后重新思考。由于未处理的异常而崩溃的进程并不常见,但它可以提供一个可调试的崩溃转储,清楚地显示错误的命令。但这只是我对catch (...)的怨恨,它与pthread_exit几乎没有关系。。。