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つの質問:
- gccの警告を抑制することはできますか?
_save
宣言の直後に割り当てられているため、gccが初期化されていない可能性があると考える理由を誰かが知っていますか?- 問題を回避するために、1 つのステートメントで変数を宣言して初期化するようにマクロが定義されていないのはなぜですか?
(最後の 2 つは、私自身の好奇心のためだけのものです)。
マクロを使用せず、すべて自分で実行することで問題を回避できますが、むしろ避けたいと思います。