Ned*_*der 7 python gcc gil cextension
在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;
}
Run Code Online (Sandbox Code Playgroud)
这很好用,让我为我的大部分代码发布GIL,但重新抓取它需要它的一小部分代码.
问题是当我用gcc编译它时,我得到:
ext/engine.c:548: warning: '_save' might be used uninitialized in this function
Run Code Online (Sandbox Code Playgroud)
因为Py_BEGIN_ALLOW_THREADS定义如下:
#define Py_BEGIN_ALLOW_THREADS { \
PyThreadState *_save; \
_save = PyEval_SaveThread();
Run Code Online (Sandbox Code Playgroud)
那么,三个问题:
_save
可以使用未初始化,因为它在声明后立即分配,并且(最后两个真的只是为了我自己的好奇心).
我可以通过不使用宏并自己完成所有操作来避免这个问题,但我宁愿不这样做.
-Wall -Wno-uninitialized
如果您只想删除此警告,您可以简单地初始化_save
为空指针,以便它不依赖于函数返回值...一行代码和注释对我来说是有意义的:
PyThreadState *_save;
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();
Run Code Online (Sandbox Code Playgroud)