如果函数被调用pthread_create
具有以下结构
try{
...code....
pthread_detach(pthread_self());
pthread_exit(NULL);
}catch(...){
std::cout<<"I am here"<<std::endl;
}
为什么在执行时调用省略号的异常处理程序pthread_exit
?
(注意std::exception
,例如,不会被抛出)
至少在海湾合作委员会pthread_exit
可能会抛出 ___forced_unwind 异常,该异常用于在线程退出期间展开堆栈。它不继承自std::exception
,因此不能被视为一个整体。如果您确实捕获了该异常,请务必重新throw
这样它就可以完成它的工作:
try {
...
} catch (abi::___forced_unwind&) {
throw;
} catch (...) {
// whatever
}
抛出异常的原因是pthread_exit
指定永不返回。让它抛出可以保证清理堆栈分配的变量,并且在其位置之后不执行代码(除非您捕获展开异常...)。然而,这是不可移植的,例如 Clang 使用完全不同的机制。
顺便说一句,这是另一个案例catch (...)
习语弊大于利。它有时用于“稳定”抛出未知异常的代码。但这只会将损害的可见性推迟到以后的时间和地点,从而无法确定问题的真正根源。在这种情况下,唯一合理的做法是进行最少的清理,可能是记录,然后重新抛出。由于未处理的异常而崩溃的进程并不好看,但它可以提供可调试的故障转储,清楚地显示错误的命令。但这只是我的怨恨catch (...)
,这与pthread_exit
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)