DirectShow アプリケーションを開発しています。デッドロックの問題が発生しました。この問題は、スレッドから呼び出されたコールバック関数でロックを取得したことが原因のようです。これは、MSDN フォーラムで質問したクエストです。
ここで、そのスレッドでロックを取得することを避ける必要があります。しかし、問題は、オーディオを別のスレッドに出力する必要があることです。どうすればロックせずにデータを別のスレッドに入れることができますか?
win32 sdk の PostMessage を使用して別のスレッドにデータを投稿できると言う人がいます。ただし、メッセージを取得するには、Windows プログラムを実行する必要があります。私のプログラムは Python C++ 拡張モジュールです。メッセージをプルするループを追加するのは非常に難しい場合があります。したがって、ロックせずにスレッド間でデータを渡す別の方法を考えています。(実際には...プロデューサースレッドはロックできませんが、コンシューマースレッドはロックできます。)
ロックするかしないか、それが問題だ。
では、問題はどのように行うかです。
ありがとう。
- - - 編集 - - -
デッドロックが発生した理由はわかっていると思いますが、それは DirectShow の問題ではない可能性があります。
メインスレッドは Python が所有しており、stop を呼び出します。つまり、GIL を保持します。そしてスレッドリターンでDirectShowのコールバック待ちを停止。ただし、コールバックは GIL を取得します。
このように見えます
メイン(GILを保持) -> 停止(コールバックを待機) -> コールバック(GILを待機) -> GIL(メインスレッドで保持)
くそ!そのため、マルチスレッドはあまり好きではありません。何はともあれ、助けてくれてありがとう。