分类 技术志 下的文章

慎用线程取消

本周二,我们产品在某省的一个节点应用运行时出现了“死锁”情况,由于监控得力,我们在“死锁”后一分钟内就发现了这个情况,并及时重启了这个节点应用。由于是集群式系统,一个节点的故障对整个系统业务的运行几乎没造成什么影响。不过,这确是一个潜在的隐患。

经过对系统当时运行日志的分析,我们将问题锁定在“线程取消”这个机制的使用上。在“生产者-消费者”实现思路这篇文章中,我曾经提到过我们目前采用的一种通知机制的实现。消费者进程的主线程创建一个子线程,后者一般挂起在条件变量上等待生产者侧的唤醒。一般情况下,这种机制运行都很良好,问题出就出在消费者进程要退出的时候。

这个机制的实现也是逐渐“改”过来的。最初发现消费者进程退出时子线程长时间无法被唤醒导致无法及时退出,主线程因为要Join子线程,所以也阻塞在Join上,两个线程都挂起了,进程也就无法退出,导致后续业务逻辑上会出现一些问题。

之前开发人员在解决这个问题上采用了“线程取消”机制,在主线程Join子线程前调用pthread_cancel取消了子线程。但由于对线程取消机制理解的不透彻,导致子线程在pthread_cond_wait这个"cancellation point"(man cancellation)上退出。在Sun官方文档中提到在pthread_cond_wait这个取消点退出线程时,线程仍然持有与条件变量关联的那把互斥锁,这样就会导致其他进程在上锁时挂起在互斥锁上。但由于我们在代码中使用了不可移植的死锁恢复机制,这个问题也就不那么明显,偶尔出现(锁状态不一致很可能会导致死锁恢复机制失效),就这个偶尔出现导致了上述问题。

与另外一个产品线的同事做了一下内部沟通,发现他们那边的产品已经做了改善(或许是我们没有经常性同步库代码导致代码出现不一致了^_^)。最初他们通过调用pthread_cleanup_push注册取消点清理程序来完成mutex的unlock,该问题得到了暂时解决。但是子线程在其内部其他取消点的退出也带来的一些麻烦,比如open日志文件时。为了控制子线程在合适的取消点退出,他们采用了Disable Cancel State的线程设置,并在关键路径上使用“enable cancel -> pthread_testcancel -> disable cancel”来设置子线程退出的窗口。

另外为了子线程能在主线程Cancel它的时候有机会被唤醒,主线程在cancel调用后,使用pthread_cond_broadcast给子线程提供了一次机会。当然这也让阻塞在同一个条件变量上的其他线程被“假唤醒”,但这种情况是可以被忍受的。

在很多讲解多线程的书籍中都不建议使用cancel机制,这里也建议慎用。直到目前也许还有一些例外情况我们还没能考虑周全呢。

Win7下招行专业版通讯问题解决

昨天,也就是23号是我的信用卡还款日,由于新本子还没来得及安装招行个人网上银行专业版,我就计划回家后用家里的本子还款。到家后也没急着上网还款,待吃完晚饭后发现联通的网络居然上不去了。打客服电话报故障,但等到今天早晨起来也不见网络恢复,只好到公司再还了。

到了公司,安装招行专业版,然后准备恢复证书,居然发现网络不通;开始以为是公司代理设置的不正确,又反复调整了几次代理设置,甚至重启的本子也不见网络连通。在专业版自带的网络测试中总是提示网络不通。

难道是招行服务器问题?让同事启动专业版试试,连通都没有问题,这下郁闷了。在命令行模式下手工PING招行服务器也无法PING通,难道是我的系统有问题了,摸不着头脑。又重装了专业版若干次,问题依旧。于是放弃了。

又登录网页版个人普通版尝试转账,试了几次都失败。从招行网站看到还可以打客服电话还款,拨95555,居然无法打通或打通后串线,这时同事那边也反映浑南开发区辽宁移动的电话网络出大故障了,手机接通后都无法听到对方,或串线听到陌生人的声音,手机打固话或接听固话也是如此,想投诉连10086都打不通。2009年末就曾经出现过一次这种情况,那时故障一天都没有恢复,后来也不了了之。这次问题也不知道能持续多长时间。

太衰了!只能期盼家里网络恢复后再转账了。

晚上回到家里,网络已经恢复了,顺利做了信用卡还款,但是心有不甘。打开x60,尝试恢复证书,专业版依然提示无法连通网络。同样是Win7系统,为什么我的T400上的专业版就没有这个问题呢?到搬了家后的谷歌上Search了一下,发现了一些端倪,我的x60和T400还是有不同的。x60安装的是Win7 Ultimate,而T400装的是Win7 Home Premium,旗舰版在安全方面做的更严格。按照CmbChina forum中网友的一个建议,尝试以管理员身份运行招行专业版(右键点击招行专业版图标,选择"以管理员身份运行"),点击网络测试,居然顺利连通,证书恢复也就很顺利的完成了。这种“以管理员身份运行”的方式有些像Ubuntu里的sudo。

不知道延迟还款一天是否会对个人信用记录有影响^_^,不管它了。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats