【问题标题】:Do threads by default run on more than one core?默认情况下,线程是否在多个内核上运行?
【发布时间】:2011-02-09 08:18:49
【问题描述】:

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

编辑:

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

没有并行编程..

进程能否在多核上运行?

我的应用程序是否受益于多核处理?


【问题讨论】:

  • 您是在问一个线程是否会在多核上运行,还是两个线程同时启动是否会在多核上运行?
  • 一般 CPU 架构相关How does a single thread run on multiple cores? - 不,单核本身是并行的(超标量)。

标签: .net multithreading


【解决方案1】:

(你的问题很不清楚。我希望我已经回答了你的问题,但如果你能澄清这个问题会有所帮助。)

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

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

编辑:您谈到一个运行许多线程的应用程序,但“没有并行编程”——这在术语上是矛盾的。如果您使用多个线程,那么您正在使用并行编程,并且默认情况下这些线程可以在多个内核上运行。如果您只使用 一个 线程,那么拥有多个核心不会给您带来任何好处——当然,除了其他进程可以使用其他核心这一事实之外。

【讨论】:

  • @John:我已经编辑了我的答案。不过,您的意思仍然不清楚,因为您谈论的是具有多线程但没有并行编程的应用程序......
  • 好的,谢谢。似乎我在并行编程(多处理)和多线程(一个处理器或内核上的多个线程)之间存在误解。我会阅读更多关于它们的信息。
  • @John:并行编程不必涉及多个进程,多线程不必涉及一个内核上的多个线程。您可以有一个进程和四个线程,每个线程都在一个内核上运行。那仍然是并行编程和多线程应用程序。
【解决方案2】:

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

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

由操作系统来调度线程。

为了充分利用多核,网络上有大量教程和知识文章,但这里有一些提示:

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

【讨论】:

    【解决方案3】:

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

    此 API 旨在让多核并行编程比以前更容易。

    【讨论】:

      【解决方案4】:

      人们似乎忘记了一个内核包含多个 ALU,尽管人类生成线性编程代码,但实际上可以同时完成多条指令,这甚至没有考虑管道。基本上,cpu 制造商需要想办法从多个核心中制造一个伪核心,而不是反过来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-13
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-10
        相关资源
        最近更新 更多