我正在开发一个 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)
该死的!这就是为什么我不太喜欢多线程的原因。不管怎样,谢谢你的帮助。