C++ アプリケーションに Python 3.2 を埋め込んでおり、プログラム内でさまざまなタイミングで実行されるサブ インタープリターがいくつかあります (によって作成されPy_NewInterpreter
ます)。彼らはさまざまなタイミングで GIL を取得および解放しますが、サブ インタープリターの 1 つを破棄したいときに問題が発生しました。
サブインタープリターを破壊するには、GIL を取得する必要があります。だから私はこれを行います:
PyEval_AcquireLock(threadstate);
次に、インタプリタを破棄します
Py_EndInterpreter(threadstate);
そして、GILを保持していたものが破壊されたので、GILを解放すると思うでしょう. ただし、ドキュメントにPy_EndInterpreter
は次のように記載されています。
指定されたスレッド状態は、現在のスレッド状態でなければなりません。以下のスレッド状態の説明を参照してください。呼び出しが戻ると、現在のスレッドの状態は NULL です。(グローバル インタープリター ロックは、この関数を呼び出す前に保持する必要があり、関数が戻るときにも保持されます。)
したがって、サブインタープリターを破棄するときに GIL を保持する必要があり、サブインタープリターを破棄するとそれが NULL に設定され、GIL を取得したスレッドがそれを解放する必要がある場合、サブインタープリターを破棄した後に GIL を解放するにはどうすればよいですか? ?