【问题标题】:Boost threads coring on startup在启动时提升线程核心
【发布时间】:2011-01-07 17:52:51
【问题描述】:

我有一个程序可以在其整个生命周期中启动和拆除多个线程。一切正常运行了一段时间,但最终,我得到了以下核心转储堆栈跟踪。

#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 会核心的原因,但我没有遇到任何问题。有人有什么想法吗?

【问题讨论】:

  • 单步调试器中的代码?

标签: c++ boost-thread


【解决方案1】:

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

【讨论】:

  • 经过一番挖掘,似乎thread_resource_error是一个可以抛出的异常。如果我没有泄漏线程,为什么会抛出这个?
  • 你现在捕捉到这个异常了吗?可能是您的线程堆栈内存不足,或者文件描述符不足。或者也许那些已经完成的线程在你join它们之前不会释放资源,或者程序完成而你没有这样做......
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 2016-10-27
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多