有人知道吗?还有一个更大的问题是当你遇到这个最大值时会发生什么?这个最大值在其他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位机器和操作系统上,这不会成为太大问题。
存在缓解策略,但只能适用于每个线程使用的堆栈空间较少。
作为一个大概指南:
通常情况下你不需要创建超过十个线程(如果您确实需要,那么您应该已经知道这些信息)。
当问起这类问题时,我听到的最好的答案是:
这不重要,如果你发现这很重要,那么你需要重新考虑自己在做什么,使其变得不重要。
请注意,如果您担心达到这个限制,请仔细检查您的设计!
回答您“更重要的问题”的是OutOfMemoryException。
下面是一些代码来找出此限制,虽然它可能取决于可用内存。 我们很想看到其他操作系统/ 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操作系统下分配给进程的用户模式地址空间大约为2GB。这允许每个进程拥有大约2000个线程(2000 * 1MB = 2GB)。对于64位系统,实际上不存在这样的问题。
这个问题看起来很老,但我想补充一下,因为它可能对其他人有帮助:
这篇文章是关于:推动Windows的极限:进程和线程。
http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx
如果你被卡在一个使用大量线程并需要扩展的现有设计中,你也可以考虑纤程:
http://msdn.microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx
它可以避免您进行全面的重新设计。
Indy曾考虑在Indy 10中实现它,但由于似乎.NET冒险占用了大部分时间,因此从未发生。