2010-10-11 68 views
1


我開始玩弄的boost ::線程,但我有點堅持了這個問題:使用異常

我不明白爲什麼這個程序崩潰的儘快拋出異常,因爲我試圖在線程中捕獲它。我認爲只要處理髮生在與投擲相同的線程中,就可以處理異常。

#include <boost/thread.hpp> 
#include <exception> 

using namespace std; 

void doWork(); 
void thrower(); 

int main(int argc, char** argv){ 
boost::thread worker(doWork); 
worker.join(); 
return 0; 
} 

void doWork(){ 
try{ 
    thrower(); 
} 
catch(const exception &e){ 
    //handle exception 
} 
} 
void thrower(){ 
// program terminates as soon as the exception is thrown 
throw exception(); 
} 

其他信息:
*使用MINGW32
*升壓v.1.44
*靠在螺紋LIB選自出多個共享庫的

+0

如果沒有正確的前向聲明和'using namespace std',甚至不會編譯。但是如果我添加這些,在Ubuntu Linux w/Boost 1.40上可以正常工作。 – 2010-10-11 15:04:51

+0

對不起,這是一個縮減版本的代碼,以顯示問題。你是靜態鏈接還是動態鏈接? – zitroneneis 2010-10-11 15:11:39

+0

也適合我。 Mac OS X使用Boost 1.44動態鏈接。 – 2010-10-11 15:37:31

回答

2

我發現問題: 這是boost庫中的一個錯誤,只有在使用比3.17更新的minGW版本時纔會出現。 Boost trac ticket #4258

應用建議的解決辦法,並設置預處理器定義BOOST_THREAD_USE_LIB後,我現在能對靜態鏈接庫,我可以有例外的工作,只要他們陷入拋出同一個線程他們。

非常感謝您的意見

0

在應用中的多線程調試DLL版本動態鏈接對於例外情況的可見性,您可能必須非常小心。默認情況下,gcc不會爲共享庫外部可見的異常生成RTTI信息,從而導致跨共享庫邊界拋出的異常「消失」。有關詳細說明和可能的陷阱,請參閱here

當然,我不能確定你是否面臨這個問題,但從你所描述的這是一種可能性。

+0

哇,這是有趣的東西。幸運的是,對我來說,這不是我的問題。無論如何,非常感謝你的想法 – zitroneneis 2010-10-12 08:13:16