Pythonを組み込み、PythonからC++へのコールバックを許可し、Pythhonコードでスレッドを生成させ、デッドロックを回避する方法はありますか?スレッドを使ったPython埋め込み - デッドロックの回避?
は問題はこれです:Pythonのに呼び出すには
、私はGILを保持する必要があります。通常、インタープリタを最初に作成したときにメインのスレッド状態を取得し、Pythonにコールする前にPyEval_RestoreThread()を使用してGILを取得し、スレッド状態でスワップすることで、これを行います。
私は、Pythonから呼び出されると、ホストの別のクリティカルセクションで保護されている保護されたリソースにアクセスする必要があるかもしれません。これは、PythonがGILを保持している可能性があることを意味します(私が最初に呼び出されたスレッド以外のスレッドから潜在的に)。そして保護ロックを取得しようとします。
Pythonを呼び出すときに、同じロックを保持する必要があるかもしれません。これは、たとえば、オブジェクトのコレクションを繰り返し処理している可能性があるためです。
問題がホストを取ることを期待し、私は、Pythonに呼び出したとき、私はGILを保持していても、Pythonは、それをあきらめ、別のスレッドにそれを与える、その後、私のホストにそのスレッドの呼び出しを持っているかもしれないということですロック。一方、ホストはホストロックとGILロックを取り、Pythonを呼び出します。デッドロックが続く
ここで問題となるのは、Pythonが呼び出されている間にGILを別のスレッドに放棄してしまうことです。それはそれが期待されるものですが、ロックをシーケンスすることが不可能になります。私が最初にGILを取ってから自分のロックを取り、Pythonを呼び出すと、Pythonは自分のロックを取ることを期待して別のスレッド(GILを解放してGILを順序付けしなかったため)。
私のシステムの残りの部分は、システム内のすべての可能なロックに対してGILを使用することはできません。それは、Pythonがそれを別のスレッドにリリースする可能性があるため、正しく動作しません。
私は、ホストのすべてのコードを制御していないため、私のホストがPythonを入力するときにロックを保持しないことを実際に保証することはできません。
これはできないのでしょうか?
ホストロックを取得する前にGILを保持するようにC++コードを要求することはできますか? – Dave