I'd like to know, how many threads can a C++ application create at most. Does OS, hardware caps and other factors influence on these bounds?
7 回答
[C++11: 1.10/1]:
[..]在托管实现下,C++ 程序可以同时运行多个线程。[..]在独立实现下,程序是否可以有多个执行线程是由实现定义的。
[C++11: 30.3/1]:
30.3 描述了可用于创建和管理线程的组件。[ 注意: 这些线程旨在与操作系统线程进行一对一的映射。 ——尾注]
所以,基本上,这完全取决于实施和操作系统;C++ 不在乎!
它甚至没有在附件 B“实施数量”中列出建议!(实际上,这似乎是一个遗漏)。
C++ as language does not specify a maximum (or even a minimum beyond the one). The particular implementation can, but I never saw it done directly. The OS also can, but normally just states a lank like limited by system resources. Each thread uses up some nonpaged memory, selector tables, other bound things, so you may run out of that. If you don't the system will become pretty unresponsive if the threads actually do work.
Looking from other side, real parallelism is limited by actual cores in the system, and you shall not have too many threads. Applications that could logically spawn hundreds or thousands usually start using thread pools for good practical reasons.
基本上,您的 C++应用程序级别没有限制。最大线程数在操作系统级别更多(基于您的体系结构和可用内存)。
在 Linux上,每个进程的最大线程数没有限制。线程的数量在系统范围内是有限的。您可以通过执行以下操作检查最大允许线程数:
cat /proc/sys/kernel/threads-max
在 Windows 上,您可以使用testlimit工具检查最大线程数:http: //blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx
在 Mac OS上,请阅读此表以根据您的硬件配置查找线程数
但是,请记住,您使用的是多任务系统。同时执行的线程数受可用处理器内核总数的限制。为了做更多的事情,系统试图在所有这些线程之间切换。每个“开关”都有一个性能(几毫秒)。如果你的系统“切换”太多,它不会加快太多时间来“工作”,而且你的整个系统会很慢。
通常,线程数的限制是可用的内存量,但也有一些系统有较低的限制。
除非你疯狂地创建线程,否则限制不太可能成为问题。创建更多线程很少有好处,一旦达到一定数量 - 这个数量可能与核心数量大致相同或高几倍(对于真正的大型重型硬件来说,这些天可能有几百个, 16 核处理器和 8 个插槽)。
受 CPU 限制的线程不应超过处理器的数量 - 没有任何好处。
正在执行 I/O 或以其他方式“坐等”的线程数量可能会更高——每个处理器内核 2-5 个似乎是合理的。鉴于现代机器在频谱的高端有 8 个插槽和 16 个内核,这仍然只有大约 1000 个线程。
当然,可以设计一个网络服务器系统,其中每个连接都是一个线程,并且系统在任何给定时间都有 10k 或 20k 个活动连接。但这可能不是最有效的。
我想知道,一个 C++ 应用程序最多可以创建多少个线程。
实现/操作系统相关。
请记住,在 C++11 之前的 C++ 中没有线程。
操作系统、硬件上限和其他因素是否会影响这些界限?
是的。
操作系统可能能够限制进程可以创建的线程数。
操作系统可以限制同时运行的线程总数(以防止分叉炸弹等,Linux 绝对可以做到这一点)。
如果每个线程分配自己的堆栈,可用的物理(和虚拟)内存将限制您可以创建的线程数。
操作系统可以提供多少线程“句柄”可能有(可能是硬编码的)限制。
底层操作系统/平台可能根本没有线程(DOS/FreeDOS 的实模式编译器或类似的东西)。
除了拥有比内核更多的线程通常不切实际之外,是的,存在限制。例如,系统可能为每个线程保留一个唯一的“进程 ID”,并且可能只有 65535 个可用。此外,每个线程都有自己的堆栈,这些堆栈最终会消耗太多内存(但是,您可以在生成线程时调整每个堆栈的大小)。
这是一篇内容丰富的文章——忽略它提到 Windows 的事实,因为这些概念在其他常见系统上是相似的:http: //blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx
C++ 标准中没有限制线程数的内容。但是,操作系统肯定会有一个硬性限制。
线程过多会降低应用程序的吞吐量,因此建议您使用线程池。