我想知道,C ++应用程序最多可以创建多少个线程。 OS,硬件上限和其他因素是否会影响这些界限?
答案 0 :(得分:19)
[C++11: 1.10/1]:
[..] 在托管实现下,C ++程序可以同时运行多个线程。 [..] 在一个独立的实现中,它是实现定义的,一个程序是否可以有多个执行线程。
[C++11: 30.3/1]:
30.3描述了可用于创建和管理线程的组件。 [注意: 这些线程旨在与操作系统线程一对一映射。 -end note]
所以,基本上,这完全取决于实施和OS; C ++不关心!
它甚至没有列出附件B“实施数量”中的建议!(实际上这似乎是一个遗漏)。
答案 1 :(得分:13)
C ++作为语言没有指定最大值(甚至超过一个最小值)。特定的实现可以,但我从未看到它直接完成。操作系统也可以,但通常只是表示受系统资源限制的lank。每个线程都会占用一些非分页内存,选择器表和其他绑定内容,因此您可能会用完它。如果你不这样做,如果线程实际上有效,系统将变得非常反应。
从另一方面来看,真正的并行性受到系统中实际内核的限制,并且您不会有太多线程。逻辑上可能产生数百或数千的应用程序通常会出于实际原因而开始使用线程池。
答案 2 :(得分:6)
基本上,您的C ++ 应用程序级别有无限制。 操作系统级别上的最大线程数量更多(基于您的体系结构和可用内存)。
在Linux上,每个进程的最大线程数没有限制。线程数量受系统限制。您可以通过执行以下操作来检查允许的最大线程数:
cat /proc/sys/kernel/threads-max
在Windows上,您可以使用testlimit工具检查最大线程数: http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx
在Mac OS上,请阅读this table以根据您的硬件配置查找线程数
但请注意,您使用的是多任务处理系统。 同时执行的线程数受可用处理器核心总数的限制。为了做更多的事情,系统试图在所有这些线程之间切换。每个“开关”都有一个执行(几毫秒)。如果你的系统“切换”太多,它就不会加速太长时间“工作”而你的整个系统会很慢。
答案 3 :(得分:3)
通常,线程数的限制是可用内存量,但是有一些系统具有较低的限制。
除非你疯狂创建线程,否则限制是不可能的。一旦达到一定数量,创建更多线程很少有益 - 这个数字可能与核心数量大致相同或高几倍(对于真正的大型,重型硬件,这些天数可能是几百个,配备16核处理器和8个插槽)。
CPU绑定的线程不应超过处理器的数量 - 没有什么好处。
进行I / O或以其他方式“等待”的线程数量可能更高 - 每个处理器核心2-5个似乎是合理的。鉴于现代机器在频谱的较高端有8个插座和16个核心,那仍然只有大约1000个线程。
当然,可以设计一个网络服务器系统,其中每个连接都是一个线程,系统在任何给定时间都有10k或20k连接。但它可能不是最有效的。
答案 4 :(得分:0)
除了拥有比核心更多线程的一般不切实际之外,是的,还有一些限制。例如,系统可以为每个线程保留唯一的“进程ID”,并且可能只有65535个可用。此外,每个线程都有自己的堆栈,这些堆栈最终会占用太多内存(但是,当你生成线程时,你可以调整每个堆栈的大小)。
这是一篇内容丰富的文章 - 忽略它提到Windows的事实,因为其他常见系统的概念类似:http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx
答案 5 :(得分:0)
C ++标准中没有任何内容限制线程数。但是,操作系统肯定会有一个硬限制。
拥有太多线程会降低应用程序的吞吐量,因此建议您使用线程池。
答案 6 :(得分:0)
我想知道,C ++应用程序最多可以创建多少个线程。
实施/ OS依赖性的。
请记住,在C ++ 11之前,C ++中没有线程。
操作系统,硬件上限和其他因素是否会影响这些界限?
是。
操作系统可能会限制进程可以创建的线程数 操作系统可以限制同时运行的线程总数(为了防止fork炸弹等,linux肯定可以这样做) 如果每个线程分配自己的堆栈,可用的物理(和虚拟)内存将限制您可以创建的线程数 可以有一个(可能是硬编码的)限制操作系统可以提供多少线程“句柄” 底层OS /平台可能根本没有线程(DOS / FreeDOS的实模式编译器或类似的东西)。