2012-03-25 11 views
1

私はPython用のC++拡張モジュールを持っています。このモジュールは、pthreadを使用して複数の計算スレッドを内部的に作成します。終了時にスレッドをクリーンアップするPy_AtExitを使用してfinalize()メソッドを登録しています。Py_AtExit登録された関数がgcc最適化コンパイルで呼び出されていない

gmpで最適化されていないデバッグビルドはうまく動作しますが、-O3でビルドするとfinalize()メソッドが呼び出されず、SIGSEGV、SIGABRTなどのさまざまなエラー(計算スレッドの場所によって異なります)そして二重の自由な腐敗。

最初は、Pythonがfinalize()関数を呼び出す前にスレッドがクラッシュしていましたが、しかし、 (1)Pythonモジュールでfinalize()メソッドを利用できるようにして、スクリプトの終わりに明示的に呼び出すと、うまく終了します。 (2)debug printで別の関数を追加し、終了時に呼び出されるように登録しました。技術(1)かスレッド数を1に制限してスクリプトがうまく終了しても、呼び出されないようです。 モジュールが最適化フラグなしでデバッグモードでコンパイルされたとき、Py_AtExit登録関数は出口で呼び出される。

誰もこれまでに経験したことはありますか?メーリングリストで何も見つかりませんでした。

いずれの回避策も高く評価されます。

+0

私はもっと楽しいものを見つけました。atexitモジュールを使用してfinalize()関数を登録すると、呼び出されます。 – subhacom

答えて

0

これはCミスです。 ちょうど私のようにそれを入れていたことを考え出し:私は最適化されたビルドをやっていた時に無効にされた

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

ので、関数は全く呼び出されていませんでした、(Makefileは-DNDEBUGは、最適化されたビルドのために、あまりにも持っていました) 。