【问题标题】:How many threads can I spawn using boost in c++?在 c++ 中使用 boost 可以生成多少个线程?
【发布时间】:2010-10-14 20:48:24
【问题描述】:

当我尝试生成太多时会发生什么?

当我生成超过 900 个线程时出现以下错误:

terminate called after throwing an instance of 'dining 1
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error>
 >dining 3
'
dining 2
  what():  dining 4
boost::thread_resource_errordining 3

这是由于尝试生成过多线程而导致的预期错误吗?

【问题讨论】:

  • 可能存在操作系统限制。请查看您的系统手册。
  • 只是出于兴趣,900个线程是干什么用的?
  • @Mark:看起来像餐饮哲学家的 900 线程实例。

标签: c++ multithreading boost concurrency


【解决方案1】:

请记住,每个线程都需要保留堆栈空间。这就是为什么你可以产生的线程数量是有限的。看起来你要么达到这个限制,要么提升阻止你达到这个限制。

这里是最新的 boost 文档的链接,该文档记录了您所看到的行为(引发的异常):boost thread docs(在该页面上搜索 boost::thread_resource_error)

【讨论】:

    【解决方案2】:

    您可以生成多少取决于您的操作环境的限制。是的,boost::thread_resource_error 是当它无法获得所需的适当线程资源时您应该期待的,per the documentation

    【讨论】:

    • 顺便说一句,我有一个愚蠢的问题。在 Windows 中大约有多少? 10左右? 50? 100? 1000? 10000?
    • 这一切都非常依赖于很多东西。你有多少内存,如果有任何操作系统级别的限制等。一般的答案是“可能至少 1(但你必须检查),也许更多”
    • 我换一种说法。在单个进程中在 Windows 中启动 10K 线程是否现实?
    • @Armen - 不能保证一般情况,但我使用的一个测试应用程序在 WinXP 上以 很多线程。
    • 在我的系统 (Ubuntu 14.04 x86_64) 上,由于套接字库中的错误,我刚刚达到 32k 线程。 [ INFO]: rx_threads.size(): 32680 [New Thread 0x7fbffa85c700 (LWP 21486)] [ INFO]: Device stream ended. Errno: 0 [Thread 0x7fbffa85c700 (LWP 21486) exited] [ INFO]: rx_threads.size(): 32681 terminate called after throwing an instance of 'boost::exception_detail::clone_impl&lt;boost::exception_detail::error_info_injector&lt;boost::thread_resource_error&gt; &gt;' what(): boost::thread_resource_error: Resource temporarily unavailable Program received signal SIGABRT, Aborted.
    【解决方案3】:

    您正在达到一个硬性限制。正如其他人所说,可能有两个限制:

    • 进程可以生成的线程数受操作系统限制(全局或每个进程)
    • 可用内存有限,每个线程保留自己的堆栈(通常为几 MB,4 MB * 900 --> 3.6 Go)

    顺便说一句,这就是 Google Go 例程的有趣之处。 Go 运行时不会产生尽可能多的线程,而是将线程数调整为可用的内核数,并在这些物理线程上手动多路复用例程。

    此外,例程是轻量级的(每个仅保留 4 KB),因为它们不使用传统堆栈(堆栈溢出的消失!),这意味着您可以有效地跨越典型机器上的数千个例程并且它不会花你太多钱。

    如果您想尝试极端的并行性:

    • 了解如何减少为每个线程分配的堆栈空间(注意堆栈溢出)
    • 切换到 Go,或寻找其他语言实现例程

    【讨论】:

      【解决方案4】:

      存在操作系统限制。这主要取决于您系统上有多少内存。如果我没记错的话,每个 pthread 线程至少有 32 兆字节的内存。默认值更多。

      【讨论】:

        猜你喜欢
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多