【发布时间】:2009-09-15 12:51:46
【问题描述】:
这是对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() 时是活动线程。
无论如何,即使我确定所有线程都已完成其工作,我也会遇到段错误,但前提是至少创建了一个。例如。在 exitPython() 之后调用 initPython() 不会产生错误。
我可以忽略这个问题,并希望操作系统知道它做了什么,但如果我能弄清楚发生了什么,我会更喜欢..
【问题讨论】:
-
好问题。如果你有时间,也许你可以帮我解决一个类似的问题:stackoverflow.com/questions/59959303/…