3

C++ アプリケーションに Python 3.2 を埋め込んでおり、プログラム内でさまざまなタイミングで実行されるサブ インタープリターがいくつかあります (によって作成されPy_NewInterpreterます)。彼らはさまざまなタイミングで GIL を取得および解放しますが、サブ インタープリターの 1 つを破棄したいときに問題が発生しました。

サブインタープリターを破壊するには、GIL を取得する必要があります。だから私はこれを行います:

PyEval_AcquireLock(threadstate);

次に、インタプリタを破棄します

Py_EndInterpreter(threadstate);

そして、GILを保持していたものが破壊されたので、GILを解放すると思うでしょう. ただし、ドキュメントにPy_EndInterpreterは次のように記載されています。

指定されたスレッド状態は、現在のスレッド状態でなければなりません。以下のスレッド状態の説明を参照してください。呼び出しが戻ると、現在のスレッドの状態は NULL です。(グローバル インタープリター ロックは、この関数を呼び出す前に保持する必要があり、関数が戻るときにも保持されます。)

したがって、サブインタープリターを破棄するときに GIL を保持する必要があり、サブインタープリターを破棄するとそれが NULL に設定され、GIL を取得したスレッドがそれを解放する必要がある場合、サブインタープリターを破棄した後に GIL を解放するにはどうすればよいですか? ?

4

1 に答える 1

3

に電話PyEval_ReleaseLock()した直後に電話するとどうなりますPy_EndInterpreter()か? とにかく、それはドキュメントがあなたにそうするように言っていることです。:)

于 2011-03-21T08:04:03.387 に答える