我可以同时运行多少个线程?

时间:2011-01-28 12:38:06

标签: .net vb.net multithreading .net-3.5

another of my questions的评论说,我只能简单地运行“这么多”线索,这是我在别处看到过的一个概念。

作为线程新手,如何确定要使用的最大线程数?或者这是一个“字符串有多长”的问题?它取决于什么?硬件配置还是什么?

(带有.Net 3.5的MS Visual Studio中的VB,如果重要的话)


更新:是否有人知道任何可以建议多个线程(或任务)的s / w工具,或者我应该只编写自己的代码,在吞吐量下降之前不断尝试不同的数字?


[Upperdate]差不多七年之后&我们现在有a software recommendations site,所以我asked如果有工具可以帮助解决此问题。

7 个答案:

答案 0 :(得分:12)

这取决于硬件,因为您(可能)不使用理论计算机而是使用物理硬件计算机,因此您的资源有限。

阅读:Does Windows have a limit of 2000 threads per process?

此外,即使您可以运行5000多个线程,具体取决于您的硬件,也可能比10线程等效程序运行得慢得多。我想你应该看看thread pooling

答案 1 :(得分:8)

通常,同时运行的线程数由您拥有的CPU和CPU核心(包括超线程)数决定。也就是说,在任何给定时间,运行的线程数(在操作系统中)等于“核心”的数量。

您可以在应用中同时运行多少个线程取决于很多因素。最好的(非专业人员)号码将是机器上的核心数量,但当然这就像假装没有人(没有其他应用程序)存在:)。

坦率地说,我会说在.NET / Windows中进行更多关于多线程的研究,因为当一个人没有真正扎实的理解时,往往会做出更多的“伤害”。 .NET具有线程池的概念,除了Windows之外,您还需要知道它是如何工作的。

在.NET 3.5 / 4.0中,您应该查看任务(Task Parallel Library),因为库可以更好地确定要生成多少个线程(如果有的话)。使用TPL,线程池得到了重大改进,并且它更灵活地生成线程和任务窃取等。但是你通常使用Tasks而不是线程。

这是一个复杂的领域,因此,.NET框架引入了任务,以便从线程中抽象程序员,从而允许运行时对此有所了解,而程序员只是说出她想要的东西而不是如何这样做。

答案 2 :(得分:7)

每个线程消耗更多内存(内核堆栈,线程环境块,线程本地,堆栈....)。 AFAIK在Windows中没有明确的限制,因此约束将是内存(可能是每个线程的堆栈)。

在Linux中,线程更像是进程(具有共享内存),并受到以下因素的限制:

cat /proc/sys/kernel/threads-max

答案 3 :(得分:3)

运行密集型任务时,一个非常好的经验法则是运行与物理核心数相同的数字。

是的,您可以运行更多任务,但是他们会等待资源(或线程池中的线程)和您的盒子,无论大小都无法在100%的时间内完全分配所有cpu核心资源由于后台/其他进程导致的线程。因此,实例化的任务越多,产生的线程就越多,因为它们超过了实际可能的并发线程(每个核心1个),资源管理,排队和交换就会越多。

我们现在使用病毒模式开始执行其他任务时所做的测试发现,最佳值非常接近cpu计数作为上限。以物理核心计数一对一比率启动的任务每个任务大约需要1分钟才能完成。设置为cpu计数的两倍,任务时间从平均1分钟到平均完成时间约5分钟。从核心数量开始的任务开始越多,几何速度越慢。

因此,例如,如果您有8个物理内核,那么8个任务(并且使用TPL,在活动进程中基本上是8个并发线程)应该是最快的。有一个主线程或进程可以创建其他任务,以及其他后台进程,但是如果这个盒子非常孤立,为了您的资源开发乐趣,那些将是相当小的。

在您从队列或列表中剔除任务时,根据核心数量编程任务上限的优势,因此当您在不同大小的盒子上部署应用程序时,它会自动调整自身。

要以编程方式确定,我们使用

var CoreCount = System.Environment.ProcessorCount / 2;

为什么要除以二?因为几乎所有现代处理器都使用逻辑核心或超线程。您应该通过自己的测试发现,如果使用逻辑计数,则每个任务的总体速度以及整个过程将显着下降。物理核心是关键。我们无法快速找到物理与逻辑相关的方法,但对我们的盒子进行快速调查发现这一直是真的。 YMMV,但这可能会让你的速度非常快。

答案 4 :(得分:2)

这在很大程度上取决于机器 - CPU和内存是主要的限制因素(虽然操作系统可能会受到限制)。

关于.NET,thread pool配置也起作用。

答案 5 :(得分:1)

根据我自己的经验,当使用线程时,一个好的经验法则是提高CPU绑定进程的性能是使用相同数量的线程作为内核,除非是超线程系统,在这种情况下应该使用核心数量的两倍。可以得出的另一个经验法则是I / O绑定过程。这个规则是每个内核的线程数量翻两番,除了超线程系统的情况,那么每个内核的线程数可以翻两番。

答案 6 :(得分:0)

我能够在我当前的旧CPU(2005)上一次运行4个线程在我的CPU蜂鸣器响起之前使用EVGA的CPU刻录机(在BIOS菜单中编程)意味着我击中了90 * c。请记住,我们正在谈论数据线程一次性工作。一个很好的例子就是一次打开多个程序。但总体而言,这取决于您的CPU在多任务处理方面有多好。 (换句话说可以处理许多活动线程)一种安全的测试方法是下载“ocscanner(通过EVGA)”和“CPU温度计”使用OC扫描仪内部的CPU刻录机测试时,确保温度不超过90 * c(或任何你觉得安全的温度)并查看你运行的当前线程数量。从2个线程开始,等待3-5分钟,同时观察CPU温度,添加另一个线程,重复。 (不要推你的运气!!!)(如果CPU温度计无法检测到你的温度,请不要试图!)