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 会核心,但我没有遇到任何事情。有人有想法么?

4

2 回答 2

2

start_thread正在抛出未捕获的异常,查看哪些异常可以start_thread抛出并在其catch周围放置一个以查看问题所在。

于 2010-01-21T13:31:32.767 回答
0

thread_resource_error 携带的值是什么?看起来你可以调用 native_error() 来找出答案。

由于这是 pthread 的包装器,因此只有几种可能性 - EAGAIN、EINVAL 和 EPERM。看起来 boost 有可能为 EINVAL 和 EPERM 抛出的异常——即 unsupported_thread_option() 和 thread_permission_error()。

这几乎离开了 EAGAIN,所以我会仔细检查您是否真的没有超过系统对线程数的限制。您确定要加入他们,或者如果分离,他们真的消失了吗?

于 2010-01-21T16:54:01.113 回答