在销毁子解释器后释放GIL
我在一个C++应用程序中嵌入了Python 3.2,并且有几个子解释器在程序的不同时间运行(是通过Py_NewInterpreter
创建的)。它们会在不同的时刻获取和释放全局解释器锁(GIL),但我在想要销毁其中一个子解释器时遇到了问题。
要销毁一个子解释器,你必须先获取GIL。所以我这样做:
PyEval_AcquireLock(threadstate);
然后我用下面的代码来销毁解释器:
Py_EndInterpreter(threadstate);
你可能会想,既然持有GIL的东西被销毁了,那它应该会释放GIL。然而,Py_EndInterpreter
的文档中说:
给定的线程状态必须是当前线程状态。请参见下面关于线程状态的讨论。当调用返回时,当前线程状态为NULL。(在调用这个函数之前必须持有全局解释器锁,并且在返回时仍然持有。)
所以,如果我在销毁子解释器时必须持有GIL,而销毁子解释器又将其设置为NULL,并且我必须用获取GIL的线程来释放它,那我在销毁子解释器后该如何释放GIL呢?
1 个回答
3
如果你在调用完 Py_EndInterpreter()
之后,立刻调用 PyEval_ReleaseLock()
,会发生什么呢?文档上是这么建议的,哈哈。 :)