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:

  1. Ist es möglich, zu unterdrücken gcc Warnung,
  2. Hat jemand eine Idee, warum gcc denkt _save vielleicht nicht initialisierte verwendet werden, da sie unmittelbar nach ihrer Erklärung zugeordnet ist, und
  3. 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.

War es hilfreich?

Lösung

  1. 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:

  1. Sie können bestimmte Warnungen unterdrücken, aber ich denke, man bereits wusste.
  2. Er sagt, Macht nicht initialisiert werden: -)
  3. 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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top