我开发了一个带多线程的boost.python C/C++程序。从线程提升python /导入模块需要ReleaseLock()。为什么?
在main()
,我创建一个线程:
PyEval_InitThreads();
pthread_create(& id,& detached_attr,newThread,NULL);
·在newThread()中,我调用了两个Py_ *函数。
Py_Initialize();
PyGILState_STATE gstate = PyGILState_Ensure();
然后,我打电话叫hoge()
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()
失败?我不知道。请告诉我如何解决这个问题。
--edit 28年12月12日---
我使用下面的方法解决了这个问题。
在main()
,我执行
Py_Initialize();
PyEval_InitThreads();
PyEval_ReleaseLock();
然后,我创建了新的线程。在新的线程,我执行
PyGILState_STATE gstate = PyGILState_Ensure();
CALL SOME PYTHON CODE
PyGILState_Release(gstate);
但我不知道为什么这现在的作品。有人能告诉我原因吗?
我建议先尝试更简单的例子。例如,试着让没有线程的代码片段运行。一旦一切按预期工作(测试!),然后尝试多线程。 –
谢谢你的建议。 我可以解决这个问题。 – fantajista
你是如何解决你的问题的?我有同样的问题.. –