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

时间:2011-02-09 08:18:50

标签: .net multithreading

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

修改

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

没有并行编程..

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

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


4 个答案:

答案 0 :(得分:15)

(你的问题还不太清楚。我希望我已经回答了你的问题,但是如果你能澄清一下有用的问题。)

由安排线程的操作系统决定。如果可能的话,在缓存一致性等方面将线程保持在同一个核心上是有好处的 - 但强制它保持在同一个核心上通常过于严格。

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

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

答案 1 :(得分:11)

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

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

由操作系统来安排线程。

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

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

答案 2 :(得分:1)

不,因此Microsoft发布了.NET Parallel API:

此API专为简化多核并行编程而设计。

答案 3 :(得分:-1)

人们似乎忘记了单个核心包含多个ALU,虽然人类生成线性编程代码,但实际上多个指令可以同时完成,甚至不考虑管道。基本上,cpu制造商需要找到一种方法,从多个核心中制作出1个伪核心,而不仅仅是相反。