代码之家  ›  专栏  ›  技术社区  ›  Ned Batchelder

使用py_begin_allow_线程时如何避免python c扩展中的gcc警告

  •  7
  • Ned Batchelder  · 技术社区  · 15 年前

    在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_线程的定义如下:

    #define Py_BEGIN_ALLOW_THREADS { \
            PyThreadState *_save; \
            _save = PyEval_SaveThread();
    

    所以,有三个问题:

    1. 是否有可能压制GCC的警告?
    2. 有人知道为什么海湾合作委员会认为 _save 可以在未初始化的情况下使用,因为它在声明后立即被分配给,并且
    3. 为什么宏没有被定义为在一条语句中声明和初始化变量以避免出现问题?

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

    我可以避免这个问题,不使用宏,自己做,但我宁愿不。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Jason Coon    15 年前
    1. 是的,可以使用-wno-前缀禁止未初始化的警告。

    -Wall -Wno-uninitialized

    如果只想删除此警告,只需初始化 _save 以使它不依赖函数返回值…一行代码和一条注释对我来说是有意义的:

    PyThreadState *_save; 
    _save = 0; /* init as null pointer value */
    _save = PyEval_SaveThread();
    
        2
  •  1
  •   csl    15 年前

    我的两分钱:

    1. 你可以隐藏特定的警告,但我想你已经知道了。
    2. 它说 可以 未初始化:-)
    3. 我能想象的唯一原因是与旧的C编译器兼容。

    我试着深入研究 the source 但找不到任何好的线索。

        3
  •  0
  •   joeforker    15 年前

    内德,你可以试试 one of these 以下内容:

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

    或者忽略 -Wuninitialized ?根据文档,在定义任何数据或函数之前必须这样做。也许它会让你仅仅对那个文件禁用警告?