Windows和Linux最大线程

时间:2013-08-20 08:19:52

标签: c++ linux windows multithreading process

Windows或Linux系统可以有多少个线程?

我正在编写一个多线程可移植代码,它应该检查系统中的最大线程数。

3 个答案:

答案 0 :(得分:3)

我很确定如果你真的“需要知道这个”,你的设计就不好了。所有现代操作系统都可以支持数千个线程。

限制通常更多地是关于可用内存和CPU资源,而不是“你可以在系统X中创建多少线程” - 换句话说,如果你的线程实际上做了什么,并且实际上使用的不仅仅是内存的微小,在创建理论上的最大线程数之前,系统将耗尽内存。

例如,在我的机器上/proc/sys/kernel/threads-max超过250000 - 我的机器有16GB的内存,因此每个线程大约有64KB。那就是如果所有内存实际上都可用于线程......其中一些将是内核代码,文件系统缓冲区等。

因此,在任何实际术语中,内存将是您的限制,而不是系统可以支持的理论线程数。

答案 1 :(得分:1)

对于Windows,TechNet有一篇由Mark Russinovich撰写的文章Pushing the Limits of Windows: Processes and Threads。该文章还链接到testlimit工具,该工具可让您在系统上进行试验。

TL; DR版本依赖于Windows版本,无论您运行的是32位还是64位Windows,以及您的应用程序是32位还是64位,以及32位程序是否为将您的程序链接为“大地址识别”(和/ 3GB NTLDR option)。它也可能取决于ASLR。这取决于您是使用默认的线程堆栈保留大小,还是调整它。

在没有/ 3GB开关的32位系统上运行的32位非大地址感知进程,以及默认的1meg堆栈保留,将限制为最多2048个线程,但您很可能会遇到内存在那之前的限制。

对于具有调整后的堆栈大小的64位进程,您可以预期使用2GB ram命中40-50k线程。

无论如何,如果你甚至接近达到32位的限制,你就是做错事(TM)。您不希望在每个请求中使用带有线程的阻塞I / O - 查看异步I / O和线程池(以及构建在这些上的所有花哨的抽象)。

答案 2 :(得分:0)

Linux,这很简单。 cat /proc/sys/kernel/threads-max

Windows,不那么了。基本上它取决于你有多少ram /你在每个线程的堆栈上分配多少 - 见What's the maximum number of threads in Windows Server 2003?;但基本上<1000