私は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登録関数は出口で呼び出される。
誰もこれまでに経験したことはありますか?メーリングリストで何も見つかりませんでした。
いずれの回避策も高く評価されます。
私はもっと楽しいものを見つけました。atexitモジュールを使用してfinalize()関数を登録すると、呼び出されます。 – subhacom