我将python解释器嵌入到一个多线程的C应用程序中,对于应该使用什么API来确保线程安全,我感到有点困惑。
据我所知,在嵌入python时,在调用任何其他Python C API调用之前,需要由嵌入器来处理GIL锁。这是通过以下函数完成的:
gstate = PyGILState_Ensure();
// do some python api calls, run python scripts
PyGILState_Release(gstate);
但仅有这一点似乎还不够。我仍然会遇到随机崩溃,因为它似乎没有为Python API提供互斥。
在阅读了更多的文档后,我还补充道:
PyEval_InitThreads();
就在调用Py_IsInitialized()
之后,但这就是令人困惑的部分。文档中提到了这个函数:
初始化并获取全局解释器锁
这表明当此函数返回时,GIL应该是锁定的,并且应该以某种方式解锁。但在实践中,这似乎不是必需的。有了这行代码,我的多线程就可以很好地工作,并且PyGILState_Ensure/Release
函数可以维护互斥。
当我尝试在PyEval_ReleaseLock()
之后添加PyEval_ReleaseLock()
时,应用程序在随后的PyImport_ExecCodeModule()
调用中很快就死锁了。
那么我在这里错过了什么呢?
https://stackoverflow.com/questions/10625584
复制相似问题