16

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

Python/C-API 文档似乎不包含这样的功能。

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

(顺便说一句。“发出致命错误”是什么意思?)

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

提前感谢您的回答!

4

2 回答 2

15

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

if (PyGILState_Check()) {
    /* I have the GIL */
}

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());
}

在我尝试过的情况下,它似乎运作良好。 https://github.com/pankajp/pygilstate_check/blob/master/_pygilstate_check.c#L9

于 2014-09-04T13:20:47.053 回答
2

我不知道你在找什么......但你应该考虑使用这两个宏Py_BEGIN_ALLOW_THREADS,并且Py_END_ALLOW_THREADS使用这个宏,你可以确保它们之间的代码没有 GIL 锁定并且它们内部的随机崩溃将是当然。

于 2013-03-06T10:10:39.177 回答