多线程并发访问同一个对象时发生死锁的反思

本文介绍了在SipPhone终端与多设备互通视频时,由于多线程并发访问同一对象引发的死锁问题。在调试过程中发现主线程因死锁而堵塞,导致模块A无法响应消息。分析表明,死锁源于两个线程同时调用C264VideoDeCode的Reset函数,导致资源竞争。解决方案包括调整代码结构,避免资源释放时机不当,并引入互斥锁来防止并发访问。文章强调理解进程线程模型及日志分析在解决问题中的重要性。
摘要由CSDN通过智能技术生成

来源:http://blog.csdn.net/lezhiyong 
   
背景:SipPhone终端与多个其他设备的用户视频互通,由于Sip终端只能显示一路视频,所以模块A采用轮询方式将多个用户视频发送到sip终端上。模块A同时允许手动打开/关闭其中一个用户的视频,当该用户视频打开时候同时选送到sip终端显示。用户视频采用H264编码,Sip终端接收H263编码视频,所以用户视频需要经过H264解码再编成H263视频的转码过程。

 调试过程中偶尔出现Sip终端显示的视频卡死现象,该问题低概率出现,通过查找模块A输出的日志文件,发现Sip终端显示的视频卡死后,模块A不再响应用户发过来的消息。经多方尝试最后定位为模块A主线程堵塞导致问题出现,而主线程堵塞原因是是多个线程访问同一个对象的发生死锁导致。

将数据流程用下面示意图表示:


当主线程和定时轮询线程同时调用C264VideoDeCode的Reset函数时候,在Reset内部死锁。

先对发生问题的C264VideoDeCode类做个说明:

C264VideoDeCode是一个H264视频解码封装类,用来完成H264解码并输出解码后的数据,里面有一个线程函数ProcessThreadFunc,通过StartVideoThread启动线程,通过StopVideoThread停止。每次启动C264VideoDeCode解码时调用的Re
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值