マルチスレッドで boost.python C/C++ プログラムを開発しています。
でmain()
、スレッドを作成します。
PyEval_InitThreads();
pthread_create( &id, &detached_attr, newThread, NULL );
・newThread()では、2つのPy_*関数を呼び出しています。
Py_Initialize();
PyGILState_STATE gstate = PyGILState_Ensure();
hoge()
次に、inという名前の C++ 関数を呼び出しますnewThread()
。
void hoge(){
py::object main_module;
py::object main_namespace;
try {
main_module = py::import("__main__"); //segmentation fault
main_namespace = main_module.attr("__dict__");
} catch (py::error_already_set const &) {
PyErr_Print();
}
//Some boost python code
}
gdb バック トレース出力はこちらです。
(gdb) bt
#0 0x4032fe24 in __ctype_b_loc () from /lib/libc.so.6
#1 0x4032fde8 in __ctype_b_loc () from /lib/libc.so.6
なぜimport()
失敗するのですか?何も思いつきません。この問題を解決する方法を教えてください。
-- 12/12/28 編集 ---
次の方法を使用してこの問題を解決しました。
でmain()
、実行します
Py_Initialize();
PyEval_InitThreads();
PyEval_ReleaseLock();
次に、新しいスレッドを作成します。新しいスレッドで、私は実行します
PyGILState_STATE gstate = PyGILState_Ensure();
CALL SOME PYTHON CODE
PyGILState_Release(gstate);
しかし、なぜこれが今機能するのかわかりません。誰か理由を教えてくれませんか?