2012-03-25 103 views
1

我有一個Python的C++擴展模塊。該模塊使用pthreads在內部創建多個計算線程。我正在使用Py_AtExit註冊finalize()方法來清理退出時的線程。當使用g ++編譯unoptmized調試版本時工作正常,當我使用-O3構建它時,finalize()方法不會被調用,Python會因各種錯誤(取決於某些計算線程的位置)而崩潰,包括SIGSEGV,SIGABRT和雙重腐敗。在gcc優化編譯中未調用Py_AtExit註冊函數

我最初雖然在Python有機會調用finalize()函數之前線程崩潰了。但是 (1)當我使Python模塊可用的finalize()方法在我的腳本結尾處顯式調用它時,它會很好地退出。 (2)我添加了調試打印的另一個函數,並註冊它在退出時調用。即使腳本通過技巧(1)或通過將線程數限制爲1,它似乎也不會被調用。 我證實,當模塊在沒有優化標誌的調試模式下編譯時,Py_AtExit註冊函數會執行在退出時被調用。

以前有人遇到過這種情況嗎?我在郵件列表中找不到任何東西。

任何解決方法將不勝感激。

+0

我剛剛發現了一件更有趣的事情:如果我通過atexit模塊註冊了finalize()函數,那麼它會被調用! – subhacom 2012-03-25 13:48:16

回答

0

這是一個C錯誤。 就想通,我是把它作爲:

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

這是禁用的,當我在做優化的建立(Makefile文件有-DNDEBUG也爲優化編譯),因此該功能沒有被稱爲在所有。