在 Python C 扩展中操作 GIL 的最简单方法是使用提供的宏:
my_awesome_C_function()
{
blah;
Py_BEGIN_ALLOW_THREADS
// do stuff that doesn't need the GIL
if (should_i_call_back) {
Py_BLOCK_THREADS
// do stuff that needs the GIL
Py_UNBLOCK_THREADS
}
Py_END_ALLOW_THREADS
return blah blah;
}
这很好用,让我为我的大部分代码释放 GIL,但为需要它的少量代码重新获取它。
问题是当我用 gcc 编译它时,我得到:
ext/engine.c:548: warning: '_save' might be used uninitialized in this function
因为 Py_BEGIN_ALLOW_THREADS 是这样定义的:
#define Py_BEGIN_ALLOW_THREADS { \
PyThreadState *_save; \
_save = PyEval_SaveThread();
所以,三个问题:
- 是否可以抑制 gcc 的警告,
- 有谁知道为什么 gcc 认为
_save
可能未初始化使用,因为它是在声明后立即分配的,并且 - 为什么没有定义宏来在一个语句中声明和初始化变量以避免该问题?
(最后两个真的只是为了我自己的好奇心)。
我可以通过不使用宏并自己做所有事情来避免这个问题,但我宁愿不这样做。