Самый простой способ управлять GIL в расширениях 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();
Так, три вопроса:
_save
мог бы использоваться неинициализированный, так как этому присваивают сразу после его объявления, и(последние два действительно только для моего собственного любопытства).
Я могу избежать проблемы, не используя макросы и делая все это сам, но я быть бы нет.
-Wall -Wno-неинициализирован
Если вы хотите удалить только это предупреждение, вы можете просто инициализировать _save
на нулевой указатель, чтобы он не полагался на значение возвращаемого функции. , Эта одна строка кода и комментарий имеет смысл для меня:
PyThreadState *_save;
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();
NED, вы можете попробовать один из них :
#pragma GCC diagnostic warning "-Wno-unitialized"
#pragma GCC diagnostic error "-Wno-uninitialized"
#pragma GCC diagnostic ignored "-Wno-uninialized"
или игнорировать -WUnИнициализированные
? Согласно документации, вы должны сделать это до определения любых данных или функций. Может быть, это позволит вам отключить предупреждение только для этого файла?
Мои два цента:
Я пытался копать источник , но не мог найти никаких хороших подсказков.