Windows Server 2003中的最大线程数是多less?
有人知道吗? 而更大的问题是当你遇到这个最大值时会发生什么? 这与其他Windows操作系统,如Vista,XP等相同的数字?
首先我会build议阅读: http : //blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx
那么http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx
总而言之,限制通常是堆栈空间(它们必须位于连续的块中),而且由于每个线程都消耗了这些散布的资源,所以快速耗尽了连续的块。 在64位机器和操作系统上,这个问题就less得多了。
缓解策略存在,但只会到目前为止(并且依靠你不使用每个线程堆栈)
作为一个粗略的指导:
- 创造十几乎是肯定的工作
- 目前的服务器和桌面硬件上可能有数百个,但风险很大
- 成千上万的人肯定会失败。
无论如何,你可能不需要创build超过十个(如果你真的需要你,应该知道这些信息)
我在提问时听到的最好的答案是:
没关系,如果你觉得这很重要,你需要重新思考你在做什么,这样做没有关系。
请注意,如果您担心触及此限制,您应该仔细检查您的devise!!!!!!!!
发生什么事的“更重要的问题”的答案是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()); }
据我所知,整个线程模型从Win2K以来应该不会有太大的改变。
线程本身并没有真正的限制,但更多的是进程栈空间的限制。 有关这方面的更多详细信息,请参阅Raymond Chen 的线程限制的深入说明 。
请阅读ShuggyCoUk的回答指出的Raymond Chen博客文章。
但要特别注意这一点:
但是每当有人问:“一个进程可以创build的最大线程数是多less? 是“为什么你创造这么多的线程,这甚至成为一个问题?”
众所周知,“每个客户端一个线程”模式不会超过十几个客户端。 如果您要同时处理多个客户端,则应该转而使用模型,而不是将线程专用于客户端,而是分配一个对象。 (有一天我会思考线程和对象之间的双重性)Windows提供I / O完成端口和线程池,以帮助您从基于线程的模型转换为基于工作项的模型。
如果您坚持使用大量线程并需要扩展的现有devise,您可能还会考虑使用光纤:
http://msdn.microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx
它可以为您节省一个重新devise。
Indy认为它是Indy 10,但它从来没有发生,因为.NET冒险大部分时间都是消耗的。
我猜测它不是线程的数量,但内存使用是限制因素。
问题似乎很古老,但也想增加对其他人的帮助:
本文关于:推动Windows的限制:进程和线程
http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx
默认堆栈大小为1MB,在32位Windows操作系统下分配给Windows进程的用户模式地址空间大约为2GB。 每个进程允许大约2000个线程(2000 * 1MB = 2GB)。 对于64位,实际上不存在这样的问题。