我開發了一個帶多線程的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
你是如何解決你的問題的?我有同樣的問題.. –