2012-03-25 5 views
1

Ich habe ein C++ Erweiterungsmodul für Python. Das Modul verwendet pthreads, um mehrere Compute-Threads intern zu erstellen. Ich registriere eine finalize() -Methode mit Py_AtExit, um die Threads beim Beenden zu bereinigen.Py_AtExit registrierte Funktion nicht in gcc optimierte Compiliert

Während das nicht optimierte Debugbuild mit g ++ gut funktioniert, wird die finalize() -Methode nicht aufgerufen und Python stürzt mit verschiedenen Fehlern ab (abhängig davon, wo sich ein Compute-Thread befand), einschließlich SIGSEGV, SIGABRT und doppelte freie Korruption.

Ich zunächst obwohl die Threads stürzten, bevor Python eine Chance hatte, die finalize() -Funktion aufzurufen. Aber (1) Wenn ich die finalize() -Methode für das Python-Modul verfügbar mache und sie explizit am Ende meines Skripts aufruft, wird sie schön beendet. (2) Ich habe eine weitere Funktion mit Debug-Druck hinzugefügt und registriert, dass sie beim Beenden aufgerufen wird. Es scheint nicht aufgerufen werden, auch wenn das Skript nett entweder über Technik (1) oder durch die Anzahl der Threads auf 1 beschränkt. Ich verifiziert, dass die Py_AtExit registriert Funktionen, wenn das Modul im Debug-Modus ohne Optimierung Flag kompiliert wird am Ausgang aufgerufen werden.

Hat das schon jemand erlebt? Ich konnte nichts in den Mailinglisten finden.

Jede Problemumgehung wird sehr geschätzt.

+0

Ich fand gerade eine lustigere Sache: Wenn ich die finalize() - Funktion über das atexit-Modul registriere, wird es aufgerufen! – subhacom

Antwort

0

Dies war ein C-Fehler. Nur dachte, dass ich es als anzog:

assert(Py_AtExit(&finalize) == 0); 

, die deaktiviert war, als ich die optimierte Build zu tun (das Makefile hatte -DNDEBUG auch für die optimierte Build), damit die Funktion nicht aufgerufen wurde .

Verwandte Themen