Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中使用boost可以生成多少线程+;?_C++_Multithreading_Boost_Concurrency - Fatal编程技术网

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

C++ 在c+中使用boost可以生成多少线程+;?,c++,multithreading,boost,concurrency,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():

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

当我生成超过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
terminate在抛出“1”的实例后调用
boost::异常\详细信息::克隆\ 3
'
餐饮2
吃什么
boost::线程资源错误3

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

可以生成多少线程取决于操作环境的限制。是的,
boost::thread\u resource\u error
是您在无法获得所需的适当线程资源时应该想到的,

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


这里有一个指向最新boost文档的链接,该文档记录了您看到的行为(引发的异常):(在该页面上搜索boost::thread\u resource\u error)

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

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

  • 进程可以产生的线程数量受操作系统的限制(全局或每个进程)
  • 可用内存有限,每个线程保留自己的堆栈(通常为几MB,4 MB*900-->3.6 Go)
顺便说一句,这就是谷歌围棋程序的有趣之处。Go运行时将根据可用的内核数调整线程数,并手动多路复用这些物理线程上的例程,而不是生成尽可能多的线程

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

如果您希望体验极端并行性:

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

可能存在操作系统限制。查看你的系统手册。只是出于兴趣,这900个线程是干什么的?@Mark:看起来像是一个900个线程的用餐哲学家实例。顺便提一下,我有一个愚蠢的问题。Windows中大约有多少个?10点左右?50? 100? 1000? 10000?这都取决于很多事情。你有多少内存,如果有任何操作系统级别的限制,等等。一般的答案是“可能至少1个(但你必须检查),可能更多”,我用另一种方式说。在一个进程中在windows中启动10K线程现实吗?@Armen-不能保证一般情况,但我使用的一个测试应用程序在WinXP上的线程数超过250个。基于此,我认为10K会有很多线程。在我的系统(Ubuntu14.04 x86_64)上,由于套接字库中的一个bug,我刚刚达到32k线程<代码>[INFO]:rx_threads.size():32680[新线程0x7fbffa85c700(LWP 21486)][INFO]:设备流结束。Errno:0[线程0x7fbffa85c700(LWP 21486)已退出][信息]:rx_threads.size():32681在抛出“boost::exception\u detail::clone\u impl”的实例后终止调用what():boost::Thread\u resource\u错误:资源暂时不可用程序收到信号SIGABRT,已中止。