0

これは説明が難しい問題ですので、不明な点がありましたらお知らせください。

C ++アプリで発生する可能性のあるデッドロックの状況を解決しようとしていますが、適切な解決策を視覚化するのに問題があります。接続しようとしている2つのライブラリによって課せられた制限により、問題は非常に複雑で面倒になりますが、すべて簡単な図にまとめることができます。簡単に言えば、私はそのような状況にあります

Python    |                 Thread 1                  Thread 2
          |
Action 1 -|-> GIL LOCK -->  Random Calls
Action 2  |   GIL LOCK <----------------------------- [Action 2]
          |                 Action 1 -- signals --->  Do_Action_1
          |                 Wait Forever              Wait on Action 2

アクション2はたまたまタイマーの起動です。私が使用しているライブラリには、設定された時間が経過すると関数を呼び出すこのタイマーコードがあります。

タイマーハンドラーを破棄しているときにタイマーが起動すると問題が発生します(アクション1)。タイマーハンドラーはタイマーが関数を終了するのを待ちますが、Python関数の呼び出しを待っているため、タイマー関数は終了できません。Pythonに入るには、タイマーハンドラーの破棄アクションによって保持されているGILを取得する必要があります。

スレッド1の私が、GILでの待機を中断し、スタックを巻き戻して、このデッドロックの危険から解放することが可能かどうか疑問に思っています。特定のOSの実装にまで踏み込むことを恐れていますが、これ以上の解決策は考えられません。

つまり、スレッド1からのアクション2の呼び出しをキャンセルしたいのですが、これはどのような方法で可能ですか?

スレッド2の操作を編集できないこと、つまり、そのスレッドを管理しているライブラリを編集できないことを述べておく必要があります。PythonのGILロックを変更して、tryロックや時限ロック、あるいは条件を待つこともできますが、それを実行するのは非常に困難です。

最善の解決策は、Pythonを変更してgilを待機することと、GILでの待機をキャンセルしたいときにスレッド1が通知できる名前付き条件を変更することだと思います。しかし、そのルートを進む前に、何か足りないものがあるかどうかを知りたいと思います。

4

1 に答える 1

0

タイマーハンドラーを破棄している場合は、プログラムを終了していると思います。終了してタイマーの強制終了を開始する前に、アクション1を防止し、スレッド1を終了させるフラグを設定できますか?テキストと完全に一致していないので、私はあなたの図を正しく読んでいることを願っています...

于 2010-02-15T05:45:40.567 に答える