我将 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()
那么我在这里错过了什么?