默认情况下,线程是否在多个核心上运行?

Hom*_*mam 12 .net multithreading

在多核处理器中,Windows应用程序运行许多线程.默认情况下,线程是否在多个核心上运行?我的意思是每个线程可能在单个核心上运行.

编辑:

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

没有并行编程..

该流程是否能够在许多核心上进行分配?

我的应用程序是否有利于多核处理?


Jon*_*eet 15

(你的问题还不清楚.我希望我已经回答了你的问题,但是如果你能澄清那些有用的问题.)

这取决于安排线程的操作系统.如果可能的话,在高速缓存一致性等方面将线程保持在同一核心上是有利的 - 但是强制它保持在同一核心上通常过于严格.

简而言之:是的,一个线程可以在不同的核心上运行.当然不是同时 - 它只是一个执行线程 - 但它可以在时间T 0在核心C 0上执行,然后在时间T 1在核心C 1上执行.

编辑:你谈到运行许多线程的应用程序,但"没有并行编程" - 这是一个矛盾的术语.如果您使用多个线程,则使用并行编程,默认情况下,这些线程可以在多个内核上运行.如果您只使用一个线程,那么您将无法从拥有多个内核中获得任何好处 - 当然,除了其他进程可以使用其他内核的事实.

  • @John:并行编程不一定涉及多个进程,多线程不一定涉及一个核心上的多个线程。您可以有一个进程和四个线程,每个线程都在一个内核上运行。那仍然是并行编程和多线程应用程序。 (3认同)

ang*_*son 11

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

如果绝对必须,可以使用Thread类的SetProcessorAffinity方法强制线程运行特定的核心.除非你知道为什么需要这样做,否则你真的不应该这样做.

由操作系统来调度线程.

为了最好地利用多个核心,网上有大量的教程和知识文章,但这里有一些提示:

  • 将您的工作分成更小的部分,这样可以避免长时间运行的线程占用单个CPU
  • 尽量避免数据争用,尝试确保每个线程/任务预先获得它需要的所有数据,并将其生成的所有数据返回到另一端,而不是必须去与数据结构交谈.这可以避免锁定问题或竞争条件.
  • 使用运行时来帮助您,不要再尝试发明轮子.如果您使用的是.NET 4.0,那么您应该查看TPL,任务并行库,它将为您提供极大的帮助.
  • 最后,多线程很难,不要跳到这个想法,你可以随心所欲地学习并随时学习.阅读主题,研究示例代码,了解陷阱以及如何避免它们.