执行您要执行的操作的正确步骤顺序是:
在主线程中:
- 使用初始化Python
Py_Initialize*
。 - 使用初始化Python线程支持
Pyeval_InitThreads()
。 - 启动C ++线程。
- 使用初始化Python
此时,主线程仍然保留GIL。
- 在C ++线程中:
- 使用获取GIL
PyGILState_Ensure()
。 - 创建一个新的Python线程对象并启动它。
- 使用释放GIL
PyGILState_Release()
。 - 睡眠,做一些有用的事情或退出线程。
- 使用获取GIL
因为主线程持有GIL,所以该线程将等待获取GIL。如果主线程调用Python API,则它可能会不时释放GIL,从而允许Python线程执行一会儿。
- 回到主线程:
- 释放GIL,使线程可以使用
Pyeval_SaveThread()
- 在尝试使用其他Python调用之前,请使用重新获取GIL
Pyeval_RestoreThread()
- 释放GIL,使线程可以使用
我怀疑您错过了最后一步-在主线程中释放GIL,从而允许Python线程执行。
我有一个小而完整的示例,该示例正是在此链接上进行的。



