Il modo più semplice per manipolare la GIL nelle estensioni Python C è quello di utilizzare le macro fornite:Come evitare avvertimento gcc in estensione Python C quando si utilizza 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;
}
Questa grande opera, facendomi rilasciare il GIL per la maggior parte del mio codice, ma ri-afferrandolo per piccoli bit di codice che ne hanno bisogno.
Il problema è quando compilo questo con gcc, ottengo:
ext/engine.c:548: warning: '_save' might be used uninitialized in this function
perché Py_BEGIN_ALLOW_THREADS è definita in questo modo:
#define Py_BEGIN_ALLOW_THREADS { \
PyThreadState *_save; \
_save = PyEval_SaveThread();
Così, tre domande:
- Is è possibile sopprimere l'avviso di gcc,
- Qualcuno ha qualche idea del perché gcc pensa che il
_save
possa essere usato non inizializzato, poiché è assegnato immediatamente dopo la sua dichiarazione, e - Perché la macro non sarebbe stata definita per dichiarare e inizializzare la variabile in una dichiarazione per evitare il problema?
(gli ultimi due sono in realtà solo per mia curiosità).
Posso evitare il problema non utilizzando i macro e facendo tutto da solo, ma preferirei di no.
Speravo in un modo molto localizzato per disabilitare solo questo avvertimento su questa linea. Preferisco non disabilitare tutti gli avvisi non inizializzati. –
se si desidera evitare solo questo avviso, aggiungere una riga prima di chiamare 'PyEval_SaveThread()' per inizializzare '_save' su un puntatore nullo (vedere risposta aggiornata sopra) –