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 を解放できますが、GIL を必要とする小さなコードについては 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();

だから、3つの質問:

  1. gccの警告を抑制することはできますか?
  2. _save宣言の直後に割り当てられているため、gccが初期化されていない可能性があると考える理由を誰かが知っていますか?
  3. 問題を回避するために、1 つのステートメントで変数を宣言して初期化するようにマクロが定義されていないのはなぜですか?

(最後の 2 つは、私自身の好奇心のためだけのものです)。

マクロを使用せず、すべて自分で実行することで問題を回避できますが、むしろ避けたいと思います。

4

3 に答える 3

3
  1. はい、-Wno- プレフィックスを使用して、初期化されていない警告を抑制することができます。

-Wall -Wno-uninitialized

この警告だけを削除したい場合は、単純_saveに null ポインターに初期化して、関数の戻り値に依存しないようにすることができます...その1行のコードとコメントは私にとって意味があります:

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

私の2セント:

  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 に答える