Skip to main content
 首页 » 编程设计

多线程:线程多于内核有什么意义

2024年02月24日18me-sa

我认为多核计算机的要点在于它可以同时运行多个线程。那么,如果你有一台四核机器,那么同时运行超过 4 个线程有什么意义呢?他们不会只是互相窃取时间(CPU 资源)吗?

请您参考如下方法:

答案围绕线程的目的,即并行性:同时运行多个单独的执行行。在“理想”系统中,每个核心将执行一个线程:无中断。事实上,情况并非如此。即使您有四个核心和四个工作线程,您的进程和线程也会不断地切换为其他进程和线程。如果您运行任何现代操作系统,每个进程都至少有一个线程,并且许多进程有更多线程。所有这些进程都同时运行。您的机器上现在可能有数百个线程正在运行。您永远不会遇到线程在没有时间“被窃取”的情况下运行的情况。 (好吧,如果是 running real-time ,如果您使用的是实时操作系统,或者甚至在 Windows 上,则可以使用实时线程优先级。但这种情况很少见。)

以此为背景,答案是:是的,真正的四核机器上超过四个线程可能会出现“互相窃取时间”的情况,但前提是每个线程都需要 100 %CPU。如果一个线程没有 100% 工作(UI 线程可能不会,或者一个线程执行少量工作或等待其他事情),那么正在调度的另一个线程实际上是一个很好的情况。

实际上比这更复杂:

  • 如果您有五项工作需要同时完成怎么办?一次运行所有这些比先运行四个然后再运行第五个更有意义。

  • 线程真正需要 100% CPU 的情况很少见。例如,当它使用磁盘或网络 I/O 时,它可能会花时间等待而不做任何有用的事情。这是一种很常见的情况。

  • 如果您有需要运行的工作,一种常见的机制是使用线程池。拥有与内核相同数量的线程似乎是有意义的,但是 the .Net threadpool has up to 250 threads available per processor 。我不确定他们为什么这样做,但我的猜测是与在线程上运行的任务的大小有关。

所以:窃取时间并不是一件坏事(也不是真正的盗窃:这就是系统应该如何工作的方式。)根据线程将执行的工作类型编写多线程程序,这可能是不受 CPU 限制。根据分析和测量计算出您需要的线程数。您可能会发现从任务或作业而不是线程的角度思考更有用:编写工作对象并将它们提供给要运行的池。最后,除非您的程序确实对性能至关重要,否则不要太担心:)