Windows或Linux系统可以有多少个线程?
我正在编写一个多线程可移植代码,它应该检查系统中的最大线程数。
答案 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