如何检查线程当前是否包含GIL?

Adr*_*aid 11 python multithreading gil

我试图找到一个函数,告诉我当前线程是否具有全局解释器锁.

Python/C-API文档似乎不包含这样的函数.

我目前的解决方案是PyGILState_Ensure()在释放之前获取锁定,PyEval_SaveThread而不是尝试释放当前线程未获取的锁定.

(顺便说一下,"发出致命错误"是什么意思?)

这个问题的背景:我有一个嵌入Python的多线程应用程序.如果线程在没有释放锁定的情况下关闭(可能由于崩溃而发生),则其他线程将无法再运行.因此,当清理/关闭线程时,我想检查该线程是否保持锁定并在这种情况下释放它.

提前谢谢你的答案!

pan*_*kaj 11

如果你正在使用(或可以使用)Python 3.4,那么有一个新函数用于完全相同的目的:

if (PyGILState_Check()) {
    /* I have the GIL */
}
Run Code Online (Sandbox Code Playgroud)

https://docs.python.org/3/c-api/init.html?highlight=pygilstate_check#c.PyGILState_Check

如果当前线程持有GIL则返回1,否则返回0.可以随时从任何线程调用此函数.只有当它的Python线程状态已初始化并且当前持有GIL时它才会返回1.这主要是辅助/诊断功能.例如,当知道GIL被锁定时,它可以在回调上下文或内存分配函数中有用,可以允许调用者执行敏感操作或以其他方式表现不同.

在python 2中,您可以尝试以下内容:

int PyGILState_Check2(void) {
    PyThreadState * tstate = _PyThreadState_Current;
    return tstate && (tstate == PyGILState_GetThisThreadState());
}
Run Code Online (Sandbox Code Playgroud)

在我尝试过的案例中似乎运作良好. https://github.com/pankajp/pygilstate_check/blob/master/_pygilstate_check.c#L9