代码之家  ›  专栏  ›  技术社区  ›  Aftershock

如何在Windows上的多个处理器上执行线程?

  •  1
  • Aftershock  · 技术社区  · 15 年前

    我在Windows(Windows 7、XP和Vista)上。如果我创建一个多线程程序,线程会在所有可用的核心上执行吗?是自动的吗?有保证吗?

    例如,如果我有四个线程和四个处理器,这些线程将在每个处理器/核心上执行一个吗?

    5 回复  |  直到 15 年前
        1
  •  3
  •   GWLlosa    15 年前

    他们可能会。这取决于运行的其他程序可能也在使用各种核心,包括操作系统。

    简而言之,操作系统应该尽量均匀地分布线程,但是试图预测每个线程如何以及何时放置在每个核心上是徒劳的。

        2
  •  5
  •   John Saunders    15 年前

    操作系统将根据线程状态、优先级等决定。

    不能保证线程都在不同的处理器上运行。实际上,对于线程执行顺序,几乎没有保证。它们可能都在同一个处理器上运行。它们可能都是并行运行的,或者根本不运行。这不太可能,但你没有任何保证。

        3
  •  2
  •   foxx1337    15 年前

    Msdn about multiple processors 解释如何强制特定处理器上的特定线程。您通常依赖操作系统。

    您可以使用getSystemInfo查询处理器的数量。

        4
  •  2
  •   Greg Hewgill    15 年前

    您可能感兴趣的是,您可以通过使用 SetThreadAffinityMask() 功能。

    然而,在几乎所有情况下,最好让操作系统管理线程到核心的分配。只有在非常特殊的情况下(例如,如果运行的高性能代码会受到上下文切换和缓存刷新的不利影响),才需要手动设置线程关联。

        5
  •  1
  •   MSalters    15 年前

    默认情况下,您创建的所有线程都是 适于居住的 在所有CPU的所有核心上执行。但是,由于您的线程不是计算机中唯一的线程,因此这些核心在您的线程中并非100%的时间都可用。因此,调度程序将为您的线程提供一个相当大的可用CPU能力。

    因为线程可以在任何地方运行,所以在线程等待另一个内核可用时,您将永远不会遇到核心什么都不做的情况。如果在一台4核机器上有4个可运行的线程,这意味着所有的内核都会很忙。 注意:线程并不总是可运行的,例如,如果它在等待I/O .