昇腾学院 | 案例分享 DestroyGraph阻塞问题

举报
xiongoal 发表于 2020/03/25 17:46:54 2020/03/25
【摘要】 问题现象描述硬件配置:Atlas 500问题现象:客户的业务代码在进行DestryGraph时,程序被阻塞,不能正常退出。关键过程、根本原因分析关键过程:1.排查DestroyGraph阻塞的一般原因:引擎线程阻塞,无法退出;内存资源未能全部释放。2.使用gdb查看当前业务进程的线程信息,如下图所示:3.红框中的信息表明:引擎号为966的face_register线程还在挂起,未能退出。初步...

问题现象描述

硬件配置:Atlas 500

问题现象:客户的业务代码在进行DestryGraph时,程序被阻塞,不能正常退出。


关键过程、根本原因分析

关键过程:

1.排查DestroyGraph阻塞的一般原因:引擎线程阻塞,无法退出;内存资源未能全部释放。

2.使用gdb查看当前业务进程的线程信息,如下图所示:

1.png

3.红框中的信息表明:引擎号为966face_register线程还在挂起,未能退出。初步定位出原因为引擎线程无法关闭。

4.检视face_register.cpp代码,发现业务代码中使用了死循环来监听网络信息,导致线程一直无法退出。如下图所示:

1.png


根本原因分析:

1face_register引擎线程中存在死循环,导致线程无法退出。从而阻塞后续析构函数的执行,内存资源无法释放,最终DestroyGraph阻塞,无法正常退出。


结论、解决方案及效果

结论:

线程中存在死循环,导致线程无法退出。DestroyGraph便一直等待线程退出,导致程序阻塞。


解决方案:

  •  新开辟线程,以执行监听业务,从而去除死循环。引擎线程即可正常退出。DestroyGraph正常执行。经验总结、预防措施和规范建议

  •  engineprocess函数中,尽量不要写死循环的程序,否则会导致DestryGraph函数执行失败。

  • 若要写有死循环的程序,应当采用新开辟线程的方式,在新开的线程中执行死循环。最后在engine的析构函数中通过信号量来关闭这个死循环的线程。



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。