などを避けるためのgccの警告Python C延長利用の場合Py_BEGIN_ALLOW_THREADS

StackOverflow https://stackoverflow.com/questions/2147029

  •  23-09-2019
  •  | 
  •  

質問

最も簡単な方法の操作は、吉Python Cの拡張子は、利用、提供されたマクロ:

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 るnullポインタのないような機能の戻り値...この一行のコードおよびコメントは意味があいて:

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

他のヒント

私の二つのセント:

  1. を抑えることができる個別の警告がでしょうが、すでに知っています。
  2. という する初期化されていない:-)
  3. 理由はただそれだけ想像できますが互換性高齢Cコンパイラでコンパイル.

っ込 のソース, もんべい手がかりになると考えられます。

scroll top