2010-01-21 39 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,所以我会仔细检查一下,你是不是真的超过了线程数的系统限制。你确定你加入他们,或者如果分离,他们真的走了?