7

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

所以,三个问题:

  1. 是否可以抑制 gcc 的警告,
  2. 有谁知道为什么 gcc 认为_save可能未初始化使用,因为它是在声明后立即分配的,并且
  3. 为什么没有定义宏来在一个语句中声明和初始化变量以避免该问题?

(最后两个真的只是为了我自己的好奇心)。

我可以通过不使用宏并自己做所有事情来避免这个问题,但我宁愿不这样做。

4

3 回答 3

3
  1. 是的,可以使用 -Wno- 前缀抑制未初始化的警告。

-Wall -Wno-uninitialized

如果您只想删除此警告,您可以简单地初始化_save为空指针,以便它不依赖函数返回值......一行代码和注释对我来说很有意义:

PyThreadState *_save; 
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();
于 2010-01-27T13:29:29.070 回答
1

我的两分钱:

  1. 您可以禁止显示特定警告,但我想您已经知道这一点。
  2. 它说可能未初始化:-)
  3. 我能想象的唯一原因是与旧 C 编译器的兼容性。

我尝试挖掘源代码,但找不到任何好的线索。

于 2010-01-27T13:30:18.407 回答
0

内德,您可以尝试以下方法之一

#pragma GCC diagnostic warning "-Wno-unitialized"
#pragma GCC diagnostic error "-Wno-uninitialized"
#pragma GCC diagnostic ignored "-Wno-uninialized"

还是忽略-Wuninitialized?根据文档,您必须在定义任何数据或函数之前执行此操作。也许它会让你禁用该文件的警告?

于 2010-01-27T15:30:24.947 回答