【发布时间】:2010-10-06 11:01:50
【问题描述】:
我正在开发 DirectShow 应用程序。我遇到了一个死锁问题,这个问题似乎是由线程调用的回调函数中的获取锁引起的。这是我在 MSDN 论坛上问的问题:
现在我必须避免在该线程中获取锁。但问题是,我必须将音频输出到另一个线程,我怎样才能将数据不加锁地放到另一个线程?
有人告诉我,我可以使用 win32 sdk 的 PostMessage 将数据发布到另一个线程。但是,为了得到消息,我必须运行一个 Windows 程序。我的程序是一个 Python C++ 扩展模块。添加循环来拉取消息可能非常困难。所以我认为另一种在线程之间传递数据而不锁定的方法。 (其实……生产者线程不能被锁定,但是消费者线程可以做到。)
锁还是不锁,这是个问题。
那么问题来了怎么办?
谢谢。
--------编辑-----
我想我知道为什么会出现死锁,那可能不是 DirectShow 的问题。
主线程归Python所有,调用stop,即持有GIL。并在线程返回中停止等待 DirectShow 的回调。但是回调获取 GIL。
看起来像这样
Main(Hold GIL) -> Stop(Wait callback) -> Callback(Wait GIL) -> GIL(Hold by Main thread)
该死的!这就是为什么我不太喜欢多线程的原因。 无论如何,谢谢你的帮助。
【问题讨论】:
-
您在 Windows 95/98 上工作吗?如果不是,那么你的操作系统是什么?
-
糟糕,我想我知道它为什么会陷入僵局。主线程拿到GIL,调用stop,stop等待callback,callback等待GIL。
标签: multithreading message-queue deadlock directshow