Самый простой способ манипулировать 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();
Итак, три вопроса:
- Возможно ли отключить предупреждение gcc,
- Кто-нибудь знает, почему gcc считает, что
_save
может использоваться неинициализированным, поскольку он назначается сразу после его объявления, а
- Почему бы не определить макрос для объявления и инициализации переменной в одном операторе, чтобы избежать проблемы?
(последние два действительно для моего собственного любопытства).
Я могу избежать этой проблемы, не используя макросы и делая все это самостоятельно, но я бы предпочел не делать этого.