La forma más sencilla de manipular el GIL en las extensiones Python C es el uso de las macros proporcionados:Cómo evitar la advertencia gcc en extensión de Python C cuando se utiliza Py_BEGIN_ALLOW_THREADS
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;
}
Esto funciona muy bien, dejando que lanza los GIL para la mayor parte de mi código, pero volviéndolo a capturar por pequeños trozos de código que lo necesitan.
El problema es cuando compilo esto con gcc, me sale:
ext/engine.c:548: warning: '_save' might be used uninitialized in this function
porque Py_BEGIN_ALLOW_THREADS se define así:
#define Py_BEGIN_ALLOW_THREADS { \
PyThreadState *_save; \
_save = PyEval_SaveThread();
Así, tres preguntas:
- Is es posible suprimir la advertencia de gcc,
- Does Alguien tiene alguna idea de por qué gcc piensa que
_save
se puede utilizar sin inicializar, ya que se asigna inmediatamente después de su declaración, y - ¿Por qué no se ha definido la macro para declarar e inicializar la variable en una declaración para evitar el problema?
(los dos últimos son realmente solo por mi propia curiosidad).
Puedo evitar el problema al no usar las macros y hacerlo todo yo solo, pero prefiero no hacerlo.
Tenía la esperanza de una forma muy localizada de desactivar solo esta advertencia en esta línea. Prefiero no deshabilitar todas las advertencias no inicializadas. –
si desea evitar solo esta advertencia, agregue una línea antes de llamar a 'PyEval_SaveThread()' para inicializar '_save' a un puntero nulo (vea la respuesta actualizada más arriba) –