在C+中嵌入Python+;运行期间发生崩溃
这个问题我已经讨论太久了。现在我搜索了一下,它工作了一段时间,但后来它在一个随机的地方坠毁了。我认为问题在于僵局之类的 请告诉我我做错了什么:在C+中嵌入Python+;运行期间发生崩溃,python,c++,multithreading,python-c-api,Python,C++,Multithreading,Python C Api,这个问题我已经讨论太久了。现在我搜索了一下,它工作了一段时间,但后来它在一个随机的地方坠毁了。我认为问题在于僵局之类的 请告诉我我做错了什么: 我创建一个全局变量: static int gil_init = 0; 在程序开始时,我调用Py\u Initialize()。这个start函数在一个会话中被多次调用,但是由于Py\u Initialize()是非操作函数,如果Python已经初始化,我认为这里没有问题 从三个函数中,我对Python/capi函数进行了大量调用-py_embed
static int gil_init = 0;
Py\u Initialize()
。这个start函数在一个会话中被多次调用,但是由于Py\u Initialize()
是非操作函数,如果Python已经初始化,我认为这里没有问题py_embed(…)
(一次只调用一个函数)。下一个代码出现在从每个线程调用的py_embed()
函数中:
if (!gil_init) {
gil_init = 1;
PyEval_InitThreads();
PyEval_SaveThread();
}
state = PyGILState_Ensure();
// Call Python/C API functions...
//pValue= PyObject_CallObject(pFunc, pArgs2); Crash is always given here
PyGILState_Release(state);
Py_Finalize()
,因为我有看看,它帮助我解决了一些线程问题。特别是本部分:
尽管如此,我发现这可能导致间歇性的
死锁。似乎每个PyThreadState
都由
PyGILState\u sure()
不是唯一的,导致多个线程
试图还原相同的PyThreadState
,导致死锁。
通过保证每个线程都具有
它自己的PyThreadState
。部分解决方案如下所示:
我想我解决了它(不能肯定,但直到现在它还没有崩溃)
问题是我在取消一些借来的参考资料。我注意到这一点是因为一些对象的引用计数是2或3。Ty用于注释。不幸的是,这不起作用。我设置了多个断点,我注意到当它到达
m_state=PyThreadState_New(m_解释器状态)时代码>它停止了。。。因此,python脚本甚至还没有到达
// Once in each thread
m_state = PyThreadState_New(m_interpreterState);
PyEval_RestoreThread(m_state);
// Perform some Python actions here
// Release Python GIL
PyEval_SaveThread();