1、问题描述
2、相关分析
2.1 总述
最近在关注Linux下的C++多线程编程,感觉是处处是地雷。Death of Thread(线程的死亡)有几种原因:
- a. 自然死亡 - 线程完成了其执行的任务,即执行到入口函数的末尾并返回。
- b. 自杀 - 线程可能因为某些内部错误,选择了自杀,即调用pthread_exit()
- c. 谋杀 - 被某个知道其tid的线程,调用pthread_cancel杀死
今天只说谋杀这个情况,即关注 pthread_cancel & c++ exception这部分:
- 这两个东东粗看貌似没有任何关联,但Ulrich Drepper告诉我们,事情不是这样的:“In NPTL thread cancellation is implemented using exceptions. (在NPTL中,线程取消是使用异常实现的)”。一旦调用了pthread_cancel(), 被谋杀者所在线程会抛出一个异常,通过栈展开(stack unwinding)来析构对象。通常这没有丝毫问题,但如果碰上这样的代码
try
{
// do something
}
catch (...) // mean catch all exception
{
// do something
}
catch(…)无法处理cancel引起的exception,进程会直接core dump,即
FATAL: exception not rethrown
Aborted (core dumped)
解决方法很简单,使用throw语句
重新抛出即可:
try
{
// do something
}
catch (...) // mean catch all exception
{
// do something
throw; // re-throw 重新抛出
}
如果你非要catch住这个exception,也不是没有办法,但这并无什么特别的用处,也违背了C++ Exception处理的原则
2.2 总结:
- 其实,最好不要用exception
- 如果要用exception,那就最好不要用pthread_cancel
- 如果非要用,那就老老实实re-throw exception吧(在catch all这种情况)
http://udrepper.livejournal.com/21541.html
http://blog.csdn.net/Solstice/archive/2011/02/12/6181488.aspx
https://www.lsgalilei.org/glibc-doc/Cancellation.html