【问题标题】:What's the maximum number of threads in Windows Server 2003?Windows Server 2003 中的最大线程数是多少?
【发布时间】:2017-03-10 12:24:10
【问题描述】:

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

【问题讨论】:

  • 我猜它不是线程数,而是内存使用量是限制因素。

标签: windows multithreading


【解决方案1】:

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

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

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

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

作为一个粗略的指南:

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

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

【讨论】:

【解决方案2】:

在提出此类问题时,我听到的最佳答案是:

没关系,如果你发现它确实很重要,你需要重新考虑你在做什么,这样它就不再重要了。

【讨论】:

  • 太棒了,当有数百个小虫子四处游荡时,线程会弄巧成拙(而且效率低下)。使用线程池,您就不用担心了。
  • +1 表示评论。成就了我的一天。在线程方面,它当然是正确的。
  • 我将在 Knights Landing 上运行 Windows。所以现在 256-288 线程非常重要
【解决方案3】:

请注意,如果您担心达到此限制,则应仔细检查您的设计!!!!!!!!!

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

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

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

  • Windows 7、VS2008、双核、2gb 内存:1,465 然后崩溃并出现 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());
        }
    

【讨论】:

  • +1 表示“如果你不得不问,那么你做错了什么”的情绪!
  • 你为什么要在社区维基上做这个?这是一个很好的答案(我 +1 了你);你应该为此获得荣誉。
  • 社区维基,因为我不关心代表的东西,它让其他人更容易添加他们的结果。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    请阅读 ShuggyCoUk's answer 所指的 Raymond Chen 博客帖子。

    但要特别注意这一点:

    但是,当有人问到“一个进程可以创建的最大线程数是多少?”时,真正的问题就出现了。是“你为什么要创建这么多线程,这甚至成为一个问题?”

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 宾果游戏! “但是,当有人问到“一个进程可以创建的最大线程数是多少?”时,真正的问题是“为什么要创建这么多线程,这甚至会成为一个问题?”
      【解决方案7】:

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

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

      它可以帮助您彻底重新设计。

      Indy 考虑将它用于 Indy 10,但它从未发生,因为 .NET 冒险似乎消耗了大部分时间。

      【讨论】:

      • ShuggyCoUk 到 OldNewThing 的第二个链接对光纤有以下说明: 请注意,光纤在这里没有多大帮助,因为光纤有一个堆栈,堆栈所需的地址空间是几乎一直都是限制因素。
      • ShuggyCoUk 的链接意味着它不是最终的解决方案。我将其更多地视为无法使用完整线程的幅度的额外缩放。但如前所述,知识来自过时的讨论,当时 64 位意味着 alpha。
      【解决方案8】:

      问题似乎很老了,但想添加也可以对其他人有所帮助:

      这篇文章是关于:推动 Windows 的极限:进程和线程

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        • 2018-09-09
        • 1970-01-01
        相关资源
        最近更新 更多