有谁知道吗?更大的问题是当你遇到这个最大值时会发生什么?这与其他Windows操作系统(如Vista,XP等)的数量是否相同?
答案 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位,实际上,没有这样的问题。