Cancellation & C++ Exception
2011-04-27 17:55 Robbin 阅读(2707) 评论(0) 编辑 收藏 举报最近在关注Linux下的C++多线程编程,感觉是处处是地雷

我做了一些笔记,这篇是关注 pthread_cancel & c++ exception部分的。
1. Death of Thread
线程的死亡有几种原因
a. 自然死亡 - 线程完成了其执行的任务,即执行到入口函数的末尾并返回。
b. 自杀 - 线程可能因为某些内部错误,选择了自杀,即调用pthread_exit()
c. 谋杀 - 被某个知道其tid的线程,调用pthread_cancel杀死
今天只说谋杀这个情况
2. pthread_cancel & exception
这两个东东粗看貌似没有任何关联,但Ulrich Drepper告诉我们,事情不是这样的:“In NPTL thread cancellation is implemented using exceptions. ”
一旦调用了pthread_cancel(), 被谋杀者所在线程会抛出一个异常,通过栈展开(stack unwinding)来析构对象。
通常这没有丝毫问题,但如果碰上这样的代码
try
{
// do something
}
catch (...) // mean catch all exception
{
// do something
}
catch(...)无法处理cancel引起的exception,进程会直接coredump
FATAL: exception not rethrown
Aborted (core dumped)
解决方法很简单,重新抛出即可
try
{
// do something
}
catch (...) // mean catch all exception
{
// do something
throw; // re-throw
}
如果你非要catch住这个exception,也不是没有办法,但这并无什么特别的用处,也违背了C++ Exception处理的原则
总结:
1. 其实,最好不要用exception
2. 如果要用exception,那就最好不要用pthread_cancel
3. 如果非要用,那就老老实实re-throw exception吧(在catch all这种情况)
至于C,则有cancellation point,回头再说。
Ref
1. http://udrepper.livejournal.com/21541.html
2. http://blog.csdn.net/Solstice/archive/2011/02/12/6181488.aspx
3. https://www.lsgalilei.org/glibc-doc/Cancellation.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界