1

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

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

4

5 回答 5

5

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

不能保证线程都将在不同的处理器上运行。实际上,在线程执行顺序方面几乎没有保证。它们可能都在同一个处理器上运行。它们可能都并行运行,也可能根本不运行。并不是说这很可能,但是您没有任何保证。

于 2009-07-10T12:10:10.590 回答
3

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

简而言之,操作系统应该尝试相当均匀地分配线程,但是尝试预测每个线程如何以及何时放置在每个内核上是徒劳的。

于 2009-07-10T12:08:58.940 回答
2

关于多处理器的 Msdn 解释了如何在特定处理器上强制执行特定线程。您通常依赖于操作系统。

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

于 2009-07-10T12:13:43.363 回答
2

您可能有兴趣知道您可以通过使用该SetThreadAffinityMask()函数来控制哪些线程可以在哪些内核上运行。

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

于 2009-07-10T12:15:35.877 回答
1

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

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

于 2009-07-10T13:05:59.573 回答