代码之家  ›  专栏  ›  技术社区  ›  Douglas Anderson

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

  •  32
  • Douglas Anderson  · 技术社区  · 16 年前

    有人知道吗?一个更大的问题是,当你遇到这个最大值时会发生什么?这个数字与Vista、XP等其他Windows操作系统相同吗。?

    8 回复  |  直到 16 年前
        1
  •  34
  •   ShuggyCoUk    16 年前

    首先,我建议您阅读以下内容: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx

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

    总之,限制通常是堆栈空间(必须在连续的块中),由于每个线程都会消耗这些分散的空间,因此您很快就会用完连续的块。 在64位机器和操作系统上,这个问题要小得多。

    缓解策略是存在的,但只会走这么远(并且依赖于每个线程不使用太多堆栈)

    作为粗略的指导:

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

    无论如何,你可能不需要创建超过十个(如果你真的 你应该已经知道这些信息了)

        2
  •  24
  •   Rex M    16 年前

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

    这并不重要,如果你发现它确实重要,你需要重新思考你在做什么,这样它就不重要了。

        3
  •  14
  •   community wiki TheSoftwareJedi    16 年前

    请注意,如果你担心达到这个极限,你应该仔细检查你的设计!!!!!!!!

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

    这不是一个直接的答案,但这里有一些代码可以找出限制。不过,它可能取决于可用内存。我有兴趣看看其他OS/cpu/mem的结果。

    请随时编辑和添加您的机器:

    • Windows 7,VS2008,双核,2gb内存: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());
          }
      
        4
  •  1
  •   Kosi2801    16 年前

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

        5
  •  1
  •   Community CDub    8 年前

    请阅读Raymond Chen的博客文章 ShuggyCoUk's answer 指向。

    但要特别注意这一点:

    但是,每当有人问“一个进程可以创建的最大线程数是多少?”时,真正的问题是“为什么创建这么多线程,以至于这甚至成为一个问题?”

    众所周知,“每个客户端一个线程”模型不能扩展到十几个客户端左右。如果你要同时处理多个客户端,你应该转向一种模型,在这种模型中,你不是将一个线程专用于一个客户端,而是分配一个对象。(总有一天我会思考线程和对象之间的二元性。)Windows提供I/O完成端口和线程池,帮助您从基于线程的模型转换为基于工作项的模型。

        6
  •  1
  •   Marco van de Voort    14 年前

    据我所知,自Win2K以来,整个线程模型应该没有太大变化。

    线程本身没有真正的限制,更多的是进程堆栈空间的限制。看a in-depth explanation of threading limits 关于此事的更多细节,请联系Raymond Chen。

        7
  •  0
  •   Saurabh D    10 年前

    如果你被一个利用大量线程的现有设计所困扰,需要扩展,你也可以考虑光纤:

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

    它可以为您节省完全重新设计的时间。

    Indy认为这是Indy 10,但它从未发生过,因为。NET冒险似乎占据了大部分时间。

        8
  •  0
  •   Teoman shipahi    8 年前

    这个问题似乎很古老,但我想补充一下,这对其他人也有帮助:

    这篇文章关于:突破Windows的极限:进程和线程

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