Wie gcc Warnung in Python C-Erweiterung zu vermeiden, wenn Py_BEGIN_ALLOW_THREADS mit
-
23-09-2019 - |
Frage
Der einfachste Weg, um die GIL in Python C-Erweiterungen zu manipulieren ist, die Makros zu verwenden, sofern:
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;
}
Dies funktioniert gut, lassen erlöse mich die GIL für den Großteil meines Codes, aber wieder packte es für kleine Stücke von Code, der es brauchen.
Das Problem ist, wenn ich das kompilieren mit gcc, erhalte ich:
ext/engine.c:548: warning: '_save' might be used uninitialized in this function
da Py_BEGIN_ALLOW_THREADS ist wie folgt definiert:
#define Py_BEGIN_ALLOW_THREADS { \
PyThreadState *_save; \
_save = PyEval_SaveThread();
So, drei Fragen:
- Ist es möglich, zu unterdrücken gcc Warnung,
- Hat jemand eine Idee, warum gcc denkt
_save
vielleicht nicht initialisierte verwendet werden, da sie unmittelbar nach ihrer Erklärung zugeordnet ist, und - Warum sollte nicht das Makro definiert wurden, um die Variable in einer Anweisung zu deklarieren und zu initialisieren, das Problem zu vermeiden?
(die letzten beiden sind wirklich nur für meine eigene Neugier).
kann ich das Problem vermeiden, indem sie nicht die Verwendung von Makros und alles selbst zu tun, aber ich möchte lieber nicht.
Lösung
- Ja, ist es möglich, nicht initialisierte Warnungen zu unterdrücken, den -Wno- Präfix.
-Wall -Wno-uninitialized
Wenn Sie nur diese Warnung entfernen möchten, können Sie einfach initialize _save
auf einen Null-Zeiger, so dass es nicht auf eine Funktion Rückgabewert angewiesen ist ..., dass eine Zeile Code und einen Kommentar macht Sinn für mich:
PyThreadState *_save;
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();
Andere Tipps
Meine zwei Cent:
- Sie können bestimmte Warnungen unterdrücken, aber ich denke, man bereits wusste.
- Er sagt, Macht nicht initialisiert werden: -)
- Der einzige Grund, warum ich mir vorstellen kann, ist die Kompatibilität mit älteren C-Compiler.
Ich habe versucht, das Graben in die Quelle , kann aber keine guten Hinweise nicht gefunden.
Ned, können Sie versuchen, eines dieser :
#pragma GCC diagnostic warning "-Wno-unitialized"
#pragma GCC diagnostic error "-Wno-uninitialized"
#pragma GCC diagnostic ignored "-Wno-uninialized"
oder -Wuninitialized
ignorieren? Gemäß der Dokumentation, müssen Sie dies tun, bevor irgendwelche Daten oder Funktionen definiert sind. Vielleicht wird es lassen Sie die Warnung nur für diese Datei deaktiviert werden?