python - 使用 Py_BEGIN_ALLOW_THREADS 时如何避免 Python C 扩展中的 gcc 警告

标签 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;
}

效果很好,让我可以为我的大部分代码释放 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. 为什么不定义宏来在一条语句中声明和初始化变量以避免该问题?

(最后两个真的只是出于我自己的好奇)。

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

最佳答案

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

-Wall -Wno-uninitialized

如果你只想删除这个警告,你可以简单地将 _save 初始化为一个空指针,这样它就不会依赖于函数返回值......那一行代码和一个评论对我来说很有意义:

PyThreadState *_save; 
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();

关于python - 使用 Py_BEGIN_ALLOW_THREADS 时如何避免 Python C 扩展中的 gcc 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2147029/

相关文章:

python - 如何将 'date' 类型的值添加到 pytable?

javascript - 序列化 Django 模型

c++ - 这个模板函数是在哪里生成的呢?可以通过 g++ 编译,但不能在 Visual Studio 中编译

c++ - 无法在 Windows 上安装最新的 GCC

c++ - 为什么 gcc 会用 _mm512_dpbusds_epi32 添加额外的 vmovdqa64 指令?

python - spacy-io 如何在没有 GIL 的情况下使用多线程?

database - 用于保存 django 模型的单独线程

python - 如果 Python 受制于 GIL,为什么还要提供锁定机制?

python - 检查列表是否是子列表

Python:无法从另一个文件导入字典