注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

DirectShow Filter 调用Stop、Pause时的死锁问题  

2010-07-30 14:05:27|  分类: 多媒体开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

DirectShow Filter 调用Stop、Pause时的死锁问题

        两个不同的线程,一个线程调用Pin的Deliver函数投递数据,另外一个线程调用Stop来停止Filter Graph。结果,死锁。

        根据现象,死锁发生时,一个线程刚好在执行Deliver,而另外一个线程刚好调用了Pause。如果另外一个线程先调用Stop,再调用Pause,就不会发生死锁;如果另外一个线程直接调用Pause,必然死锁。

        因为担心内存泄露,所以,我在Deliver和Stop、Pause中都使用了同一个锁。而有些人的做法是,数据传输使用一把锁,停止、暂停使用另外一把锁。——如果是这样的话,基本上不会出问题了。但我认为,这可能导致部分Sample没有被回收。  所以,我还是坚持使用一个锁。

       

 

        解决!在我的程序中,Deliver的时候,根本不用加锁,因为Deliver只可能在一个线程中执行!

——之前,我看了一下CSource类,发现它里面创建了一个线程。为了节省这一个线程的资源,我没有继承CSource类,而是直接继承了CBaseFilter,没想到就出现上面的问题。于是,就查阅CSource的源码(..\Microsoft Direct SDK\Extras\DirectShow\Samples\C++\DirectShow\BaseClasses里面),恍然大悟。

 

此外,不能调用Filter的IsActive函数,因为这个函数会加锁的!调用它,也可能导致死锁。

 

上面的这些方法只能减少死锁出现的几率,但是,极少数情况下,死锁还是会发生,于是,我又在Stop里面调用了EndOfStream。

 

By:zhanyonhu

  评论这张
 
阅读(1218)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016