代码之家  ›  专栏  ›  技术社区  ›  jonderry

在c++中使用boost可以生成多少个线程?

  •  8
  • jonderry  · 技术社区  · 14 年前

    当生成超过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
    

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

    4 回复  |  直到 14 年前
        1
  •  9
  •   Michael Goldshteyn    14 年前

    记住,每个线程都需要保留堆栈空间。这就是为什么可以生成的线程数有限制。看起来你不是在达到这个极限,就是boost阻止你达到这个极限。

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

        2
  •  4
  •   Daniel DiPaolo    14 年前

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

        3
  •  1
  •   Matthieu M.    14 年前

    你正在达到一个严格的极限。正如其他人所说,有两个限制:

    • 可用内存有限,每个线程都保留自己的堆栈(通常为几MB,4 MB*900-->3.6 Go)

    顺便说一句,这就是谷歌围棋程序的有趣之处。Go运行时不会生成尽可能多的线程,而是根据可用内核的数量调整线程的数量,并在这些物理线程上手动多路复用例程。

    如果你想尝试极端并行:

    • 了解如何减少为每个线程分配的堆栈空间(注意堆栈溢出)
        4
  •  0
  •   Jay    14 年前

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