Windows Server 2003中线程的最大数量是多少?

问题描述:

有谁知道吗?而更大的问题是当你遇到这个最大值时会发生什么?这与其他Windows操作系统(例如Vista,XP等)的数字相同吗?Windows Server 2003中线程的最大数量是多少?

首先,我会建议阅读本: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx

然后http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx

总之,限制是正常的堆栈空间(必须是连续的块)和因为每个线程迅速消耗这个散落您用尽连续块。 在64位机器和操作系统上,这个问题要少得多。

减灾战略存在,但只能走这么远(和依靠你不使用每个线程的堆栈)

作为一个粗略的指南:

  • 创造几十几乎可以肯定工作
  • 在当前的服务器和桌面硬件上可能有数百个可能,但有风险
  • 成千上万的几乎肯定会失败。

你可能不应该需要创建十余反正(如果你真的需要你应该已经知道这个信息)

+0

当内存不碎片化时,尽早创建它们并将它们合并以备后用时也应该有所帮助。 – 2011-08-24 07:38:46

林猜测它不是线程的数量,但内存使用率是限制因素。

据我了解整个线程模型它应该自Win2K以来没有多大改变。

线程本身并没有真正的限制,但更多的是进程栈空间的限制。有关详细信息,请参阅Raymond Chen的in-depth explanation of threading limits

+0

宾果! “但是每当有人问到”进程可以创建的线程的最大数量是多少“时,就会产生真正的问题:”为什么创建这么多的线程,这甚至成为一个问题?“” – TheSoftwareJedi 2009-01-27 00:27:07

最好的答案问这样的问题时,我听到的是:

不要紧,如果你发现这非常重要,你需要重新考虑自己在做什么,以便它没关系。

+5

Bravo,线程当有数百个小小的bug gers floating floating become become become become become become become become become become become become become become使用线程池,您不必担心。 – paxdiablo 2009-01-27 00:29:13

+1

+1的评论。创造了我的一天。当涉及到线程时,它肯定是成立的。 – 2011-08-07 12:22:42

+0

我要在Knights Landing上运行Windows。所以它现在对256-288线程 – user1649948 2016-06-20 22:17:59

请注意,如果您担心触及此限制,您应该仔细检查您的设计!!!!!!!!

发生什么事情的“更重要的问题”的答案是OutOfMemoryException。

不完全是一个直接的答案,但这里有一些代码来找出限制。它可能是可用的内存依赖。对查看其他OS/cpu/mem结果感兴趣。

随意编辑和添加您的机器:

  • 的Windows 7,VS2008,双核,2GB MEM:1465然后用OutOfMemoryException异常崩溃

    int i = 0; 
        try 
        { 
         while (true) 
         { 
          new Thread(new ThreadStart(() => Thread.Sleep(int.MaxValue))).Start(); 
          i++; 
         } 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(i); 
         Console.WriteLine(ex.ToString()); 
        } 
    

务必阅读雷蒙德陈博客帖子指出,ShuggyCoUk's answer指出。

但要特别注意这一点:“那是什么一个进程可以创建的最大线程数”

但这种情况正在提出的真正的问题,每当有人问,是“为什么你创造这么多线程,这甚至成为一个问题?”

“每个客户端一个线程”模式是众所周知的,不会超过十几个客户端等。如果你要同时处理多个客户端,你应该转向一个模型,而不是将一个线程专用于客户端,而是分配一个对象。 (有一天我会研究线程和对象之间的双重性)。Windows提供了I/O完成端口和一个线程池,以帮助您从基于线程的模型转换为基于工作项的模型。

如果你坚持使用现有的设计,采用了大量的线程,需要扩展,您也可以考虑纤维:

http://msdn.microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx

它可以节省你完全重新设计。

Indy认为它适用于Indy 10,但它从来没有发生过,因为.NET冒险大部分时间都是消耗的。

问题似乎很老了,但想作为补充可以是有益他人,以及:

本文有关:推的Windows的限制:进程和线程

http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

默认堆栈大小为1MB,在32位Windows操作系统下分配给Windows进程的用户模式地址空间大约为2 GB。每个进程允许大约2000个线程(2000 * 1MB = 2GB)。对于64位来说,实际上不存在这样的问题。