这是对Call Python from C++的后续。
在程序启动时,我调用以下函数来初始化解释器:
void initPython(){
PyEval_InitThreads();
Py_Initialize();
PyEval_ReleaseLock();
}
每个线程都创建自己的数据结构并使用以下方式获取锁:
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
//call python API, process results
PyGILState_Release(gstate);
一旦你理解了GIL,这个问题就很直截了当,但问题在于当调用Py_Finalize()时,我遇到了一个段错误。
void exitPython(){
PyEval_AcquireLock();
Py_Finalize();
}
参考文献对于Py_Finalize()的解释有些模糊(或者我可能只是理解错了),我不确定在有一些活动线程时PyEval_AcquireLock()能否获取锁,以及如果在调用Py_Finalize()时有活动线程会发生什么。无论如何,即使我确定所有线程都已完成工作,只要至少创建了一个线程,就会出现段错误。例如,调用initPython()后跟exitPython()不会创建任何错误。我可以忽略这个问题并希望操作系统知道它在做什么,但我更希望能够弄清楚发生了什么。