我开发了一个带有多线程的 boost.python C/C++ 程序。
在main()
中,我创建了一个线程:
PyEval_InitThreads();
pthread_create( &id, &detached_attr, newThread, NULL );
・在 newThread() 中,我调用了两个 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()
失败?我不知道。请告诉我如何解决这个问题。
——编辑 28 年 12 月 12 日——
我使用以下方法解决了这个问题。
在main()
中,我执行
Py_Initialize();
PyEval_InitThreads();
PyEval_ReleaseLock();
然后我创建新线程。在新线程中,我执行
PyGILState_STATE gstate = PyGILState_Ensure();
CALL SOME PYTHON CODE
PyGILState_Release(gstate);
但我不知道为什么这现在有效。有人可以告诉我原因吗?