2010-01-21 46 views
0

我有一個程序可以在整個生命週期中調用並關閉多個線程。一切都很好,但最終,我得到以下核心轉儲堆棧跟蹤。提升線程在啓動時取芯

#0 0x009887a2 in _dl_sysinfo_int80() from /lib/ld-linux.so.2 
#1 0x007617a5 in raise() from /lib/tls/libc.so.6 
#2 0x00763209 in abort() from /lib/tls/libc.so.6 
#3 0x003ec1bb in __gnu_cxx::__verbose_terminate_handler() from /usr/lib/libstdc++.so.6 
#4 0x003e9ed1 in __cxa_call_unexpected() from /usr/lib/libstdc++.so.6 
#5 0x003e9f06 in std::terminate() from /usr/lib/libstdc++.so.6 
#6 0x003ea04f in __cxa_throw() from /usr/lib/libstdc++.so.6 
#7 0x00d5562b in boost::thread::start_thread() from /h/Program/bin/../lib/libboost_thread-gcc34-mt-1_39.so.1.39.0 

起初,我被泄露的線程,並推斷核心是由於目前打線程數的一些最大極限,但現在看來,即使我不出現此問題。作爲參考,在上面的核心中,有13個活動線程正在執行。

我做了一些搜索,試圖找出爲什麼start_thread會核心,但我沒有遇到任何東西。有人有主意嗎?

+0

單步執行調試器中的代碼? – jalf 2010-01-21 13:41:13

回答

2

start_thread正在拋出未捕獲的異常,請查看哪些異常可以start_thread拋出並在其周圍放置一個catch以查看問題所在。

+0

做了一些挖掘之後,似乎thread_resource_error是可以拋出的異常。如果我沒有泄漏線程,爲什麼會拋出? – 2010-01-21 14:19:25

+0

你現在是否抓住了這個異常?可能是因爲線程堆棧的內存不足,或者文件描述符耗盡。或者,也許那些已經完成的線程不會釋放資源,直到你「加入」它們或者程序結束,而你沒有這樣做...... – 2010-01-21 14:22:30

0

thread_resource_error帶有什麼值?它看起來像你可以調用native_error()來找出。

由於這是pthreads的包裝,因此只有幾種可能性 - EAGAIN,EINVAL和EPERM。它看起來好像boost有可能拋出EINVAL和EPERM的異常 - 即unsupported_thread_option()和thread_permission_error()。

這幾乎離開了EAGAIN,所以我會仔細檢查一下,你是不是真的超過了線程數的系統限制。你確定你加入他們,或者如果分離,他們真的走了?