PyThreadState
現在のスレッドには がないようですので、作成したいと思います。
現在の PyInterpreterState を に渡すにPyThreadState_New(...)
はどうすればよいですか、それとも Python からライブラリを呼び出すのではなく、インタープリターを埋め込んでいる (したがって作成した) 場合にのみ行うべきことですか?
PyThreadState
現在のスレッドには がないようですので、作成したいと思います。
現在の PyInterpreterState を に渡すにPyThreadState_New(...)
はどうすればよいですか、それとも Python からライブラリを呼び出すのではなく、インタープリターを埋め込んでいる (したがって作成した) 場合にのみ行うべきことですか?
マルチスレッドプログラミングをしているのではないかと思います。最近、私は同様の問題を抱えています。次のコードがお役に立てば幸いです。
//in main thread
PyThreadState * mainThreadState = NULL;
Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyThreadState_Get();
PyEval_ReleaseLock();
//in threaded thread
PyEval_AcquireLock();
PyInterpreterState * mainInterpreterState = mainThreadState->interp;
PyThreadState * myThreadState = PyThreadState_New(mainInterpreterState);
PyEval_ReleaseLock();
/*
* embeded python part
* PyEval_CallObject() for example
*/
Python 以外で作成されたスレッドから Python にコールバックしようとしている場合は、PyGILState_Ensure() API を使用できます。これにより、現在のスレッドにまだスレッド状態がない場合に、一時的なスレッド状態が作成されます。
詳細については、 http://docs.python.org/c-api/init.html#non-python-created-threadsを参照してください。
Python スレッドから呼び出されたコードで GIL を解放することは、Py_BEGIN(/END)_ALLOW_THREADS
マクロを使用することでさらに簡単になります:
http://docs.python.org/c-api/init.html#releasing-the-gil-from-extension-code
PyThreadState
メインスレッドにa がないことは致命的なエラーであることが判明しました。これは、2 つの異なるバージョンの Python が同時にリンクされていることが原因で発生したため、この質問はやや意味がありません。