【发布时间】:2017-03-10 12:24:10
【问题描述】:
有人知道吗?更大的问题是当你遇到这个最大值时会发生什么?这与其他 Windows 操作系统(如 Vista、XP 等)是否相同?
【问题讨论】:
-
我猜它不是线程数,而是内存使用量是限制因素。
有人知道吗?更大的问题是当你遇到这个最大值时会发生什么?这与其他 Windows 操作系统(如 Vista、XP 等)是否相同?
【问题讨论】:
首先,我建议您阅读以下内容: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx
然后http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx
总而言之,限制通常是堆栈空间(必须在连续的块中),并且由于每个线程都会消耗这个分散在您周围的空间,因此您很快就会用完连续的块。 在 64 位机器和操作系统上,这不是问题。
缓解策略是存在的,但只能走这么远(并且依赖于您不会在每个线程中使用太多堆栈)
作为一个粗略的指南:
无论如何,您可能不需要创建超过 10 个(如果您真的确实需要,您应该已经知道这些信息)
【讨论】:
在提出此类问题时,我听到的最佳答案是:
没关系,如果你发现它确实很重要,你需要重新考虑你在做什么,这样它就不再重要了。
【讨论】:
请注意,如果您担心达到此限制,则应仔细检查您的设计!!!!!!!!!
关于发生的事情的“更重要的问题”的答案是 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());
}
【讨论】:
默认堆栈大小为 1MB,在 32 位 Windows 操作系统下分配给 Windows 进程的用户模式地址空间约为 2 GB。每个进程允许大约 2000 个线程(2000 * 1MB = 2GB)。对于 64 位,实际上没有这样的问题。
【讨论】:
请阅读 ShuggyCoUk's answer 所指的 Raymond Chen 博客帖子。
但要特别注意这一点:
但是,当有人问到“一个进程可以创建的最大线程数是多少?”时,真正的问题就出现了。是“你为什么要创建这么多线程,这甚至成为一个问题?”
众所周知,“每个客户端一个线程”模型不会扩展到超过十几个客户端左右。如果您要同时处理多个客户端,则应该转移到一个模型,在该模型中,不是将线程专用于客户端,而是分配一个对象。 (总有一天我会思考线程和对象之间的二元性。)Windows 提供 I/O 完成端口和线程池来帮助您从基于线程的模型转换为基于工作项的模型。
【讨论】:
据我了解,自 Win2K 以来,整个线程模型应该没有太大变化。
线程本身并没有真正的限制,但更多的是进程堆栈空间的限制。有关更多详细信息,请参阅 Raymond Chen 的 in-depth explanation of threading limits。
【讨论】:
如果您坚持使用大量线程并需要扩展的现有设计,您也可以考虑使用光纤:
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
【讨论】: