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

时间:2010-10-14 20:48:25

标签: c++ multithreading boost concurrency

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

当我产生超过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 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

你正在达到一个硬限制。正如其他人所说,可能存在两个局限:

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

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

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

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

  • 找到如何减少每个线程分配的堆栈空间(小心堆栈溢出)
  • 切换到Go,或找到另一种实现例程的语言

答案 3 :(得分:0)

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