.net 在Windows上可以并发运行多少个线程?

uemypmqf  于 2022-12-24  发布在  .NET
关注(0)|答案(7)|浏览(245)

another of my questions的一条注解说我只能并发运行“这么多”线程,这是我在其他地方看到的概念。
作为一个线程新手,我如何确定要使用的线程的最大数量?或者这是一个“一段字符串有多长”的问题?它取决于什么?硬件配置还是什么?
(VB在带有.Net 3.5的MS Visual Studio中(如果有问题)
更新:有人知道有什么软件工具可以建议线程(或任务)的数量吗?或者我应该自己编写代码,不断尝试不同的数量,直到吞吐量下降?
[更新]差不多七年过去了&我们现在有了a software recommendations site,所以如果有工具可以帮助解决这个问题,我会asked

3qpi33ja

3qpi33ja1#

这取决于硬件,因为你(可能)没有使用理论上的计算机,而是使用物理硬件,所以你的资源有限。
读取:Does Windows have a limit of 2000 threads per process?
此外,即使你可以运行5000多个线程,取决于你的硬件,这可能比10个线程的程序运行得慢得多,我认为你应该看看thread pooling

cgvd09ve

cgvd09ve2#

通常情况下,真正并发运行的线程数量由您拥有的CPU和CPU内核(包括超线程)的数量决定。也就是说,在任何给定的时间,运行的线程数量(在操作系统中)都等于“内核”的数量。
你的应用能同时运行多少个线程取决于很多因素。最好的(外行人)数字是机器上的内核数,但当然这就像假装没有其他应用存在一样:)。
坦率地说,我会说对.NET/Windows中的多线程做更多的研究,因为当一个人没有真正扎实的理解时,往往会造成更多的“损害”而不是好处。.NET有线程池的概念,除了Windows之外,你还需要知道它是如何工作的。
在.NET 3.5/4.0中,您应该查看Tasks(Task Parallel Library),因为该库在确定要产生多少线程(如果有的话)方面做得更好。使用TPL,线程池得到了重大的改进,它在产生线程和任务窃取等方面更智能。但您通常使用Tasks而不是线程。
这是一个复杂的领域,因此,.NET框架引入了任务,以便将程序员从线程中抽象出来,从而允许运行时在这方面很聪明,而程序员只是说她想要什么,而不是怎么做。

pw9qyyiw

pw9qyyiw3#

在运行密集型任务时,一个非常好的经验法则是运行与物理内核数量相同的数量。
可以,您可以运行更多任务,但它们将等待资源(或者线程池中的线程),而你的机器,不管大小,由于后台/其他进程的原因,不能100%地将所有的cpu核心资源分配给一个线程,所以你示例化的任务越多,你产生的线程就越多,因为它们超过了实际可能的并发线程(每个内核1个),资源管理、排队和交换就越多。
我现在工作的地方做了一个测试,使用病毒模式启动额外的任务,发现最优非常接近CPU数量上限。以一比一的比例启动的任务与物理内核数量运行大约1分钟完成每个任务。设置为CPU数量的两倍,任务时间从平均1分钟减少到平均5分钟。2超过核心数的任务越多,速度就越慢。
例如,如果你有8个物理内核,8个任务(使用TPL,活动进程中有8个并发线程)应该是最快的。有创建其他任务的主线程或进程,还有其他后台进程,但如果为了你的资源开发乐趣,盒子是相当孤立的,这些将是相当少的。
当您咀嚼队列或列表中的任务时,基于核心数编程任务上限的好处是,当您在不同大小的机器上部署应用程序时,它会自动调整自己。
要以编程方式确定这一点,我们使用
第一个月
你会问,为什么要除以2?因为几乎所有的现代处理器都使用逻辑内核或超线程。你应该会通过自己的测试发现,如果你使用逻辑内核,你的每项任务的整体速度,以及整个进程的速度,都会显著下降。物理内核是关键。我们无法找到一种快速的方法来找出物理内核与逻辑内核,但对我们的盒子进行快速调查后发现,这一直是正确的。YMMV,但这可能会让你走得很快。

ifmq2ha2

ifmq2ha24#

每个线程消耗更多的内存(内核堆栈、线程环境块、线程本地、堆栈......)。AFAIK在Windows中没有明确的限制,因此约束将是内存(可能是每个线程的堆栈)。
在Linux中,线程更像是进程(具有共享内存),您受到以下约束:

cat /proc/sys/kernel/threads-max
aor9mmx1

aor9mmx15#

这在很大程度上取决于机器- CPU和内存是主要的限制因素(虽然操作系统的限制可能会进入它)。
对于.NET,thread pool配置也起作用。

8wigbo56

8wigbo566#

根据我自己的经验,当使用线程时,一个很好的经验法则是使用相同数量的线程作为核心来提高CPU绑定进程的性能,除非是在超线程系统中,在这种情况下,应该使用两倍的核心。另一个经验法则是I/O绑定进程。这个规则是将每个核心的线程数量增加四倍。除了超线程系统的情况之外,每个核的线程数可以是四倍。

ncecgwcz

ncecgwcz7#

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

相关问题