线程默认是否在多个核心上运行?

14

在多核处理器中,Windows应用程序运行许多线程。这些线程默认情况下会在多个核心上运行吗?也就是每个线程可能在独立的核心上运行。

编辑:

如果我的应用程序运行多个线程,所有这些线程将在一个进程中运行。

没有并行编程...

这个进程能够分割并在多个核心上运行吗?

我的应用程序能从多核处理中受益吗?



1
你是在问一个线程是否会在多个核心上运行,还是同时启动的两个线程会在多个核心上运行? - Lasse V. Karlsen
关于 CPU 架构的相关问题 一个单线程如何在多个核心上运行? - 不是的,单个核心本身就是并行的(超标量)。 - Peter Cordes
4个回答

20

您的问题相当不清楚。我希望我回答了您的问题,但如果您能澄清问题,那将有所帮助。

线程调度由操作系统决定。保持线程在同一核心上具有优势,例如缓存一致性等方面,但是强制其在同一核心上运行通常过于严格限制。

简而言之:是的,线程可以在不同的核心上运行。当然不能同时运行 - 它只有一个执行线程 - 但它可以在T0时间在C0核心上执行,然后在T1时间在C1核心上执行。

编辑:您提到应用程序运行多个线程,但“没有并行编程” - 这是自相矛盾的。如果您使用许多线程,则正在使用并行编程,并且默认情况下这些线程可以在多个核心上运行。如果您只使用一个线程,则除了其他进程可以使用其他核心之外,您将不会从多个核心中获得任何好处。


@John:我已经编辑了我的答案。不过你说的应用程序有多个线程但没有并行编程,还是不太清楚你的意思。 - Jon Skeet
好的,谢谢。看来我对并行编程(多进程)和多线程(一个处理器或核心上的多个线程)之间有些误解。我会多了解一下它们。 - Homam
3
@John:并行编程不一定涉及多个进程,而多线程也不一定涉及一个核心上的多个线程。您可以有一个进程和四个线程,每个线程在单个核心上运行。这仍然是并行编程和多线程应用程序。 - Jon Skeet

13

当你启动多个线程时,它们可能会运行在不同的CPU核心上,也可能不会。

如果你真的有必要,可以使用Thread类SetProcessorAffinity方法来强制线程在特定的CPU核心上运行。但是,除非你知道自己为什么需要这样做,否则真的不应该这样做。

调度线程由操作系统负责。

要充分利用多个CPU核心,网上有很多教程和知识文章,以下是一些技巧:

  • 将工作分解成较小的部分,避免一个长时间运行的线程独占一个CPU。
  • 尽量避免数据争用,确保每个线程/任务从一开始就得到所有需要的数据,并将生成的所有数据返回,而不是必须访问数据结构。这避免了锁定问题或竞态条件。
  • 利用运行时的帮助,不要试图重新发明轮子。如果你在.NET 4.0中,应该看看TPL(Task Parallel Library),它会给你带来极大的帮助。
  • 最后,多线程编程很难,请不要跳进去以为自己可以靠临时学习就搞定。阅读相关主题的文献资料,研究示例代码,学习有关陷阱及如何避免的知识。

2

人们似乎忘记了一个单个核心包含多个ALU,并且尽管人类生成线性编程代码,但实际上可以同时执行多个指令,甚至不考虑管道。基本上,CPU制造商需要找到一种方法,将多个核心合成一个伪核心,而不仅仅是相反的情况。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接