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

时间:2009-01-27 00:12:56

标签: windows multithreading

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

8 个答案:

答案 0 :(得分:35)

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

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

总而言之,限制通常是堆栈空间(必须在连续的块中),并且因为每个线程都消耗了这些分散的空间,所以很快就会耗尽连续的块。 在64位计算机和操作系统上,这不是一个问题。

存在缓解策略,但只会到目前为止(并且依赖于每个线程不使用多少堆栈)

作为一个粗略的指南:

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

你可能不需要创建超过10个(如果你真的需要你已经知道这个信息)

答案 1 :(得分:26)

我在提出这些问题时听到的最佳答案是:

  

没关系,如果你发现它确实重要,你需要重新思考你正在做的事情,这无关紧要。

答案 2 :(得分:15)

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

对你所发生的“更重要的问题”的答案是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());
        }
    

答案 3 :(得分:2)

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

但要特别注意这一点:

  

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

     

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

如果您遇到使用大量线程且需要扩展的现有设计,您可能还会考虑光纤:

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

它可以为您节省全部重新设计。

Indy认为它适用于Indy 10,但它从未发生过,因为.NET冒险在大部分时间消耗了。

答案 6 :(得分:0)

问题似乎很老但是喜欢添加,对其他人也有帮助:

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

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

答案 7 :(得分:0)

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