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

时间:2009-07-10 12:06:23

标签: windows multithreading execution

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

例如,如果我有四个线程和四个处理器,那么线程是否会在每个处理器/核心上执行一次?

5 个答案:

答案 0 :(得分:5)

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

无法保证线程将全部在不同的处理器上运行。实际上,很少有关于线程执行顺序的保证。它们可能都运行在同一个处理器上。它们可能全部并行运行,也可能根本不运行。并非这可能,但你没有任何保证。

答案 1 :(得分:3)

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

简而言之,操作系统应该尝试非常均匀地分配线程,但是试图预测每个线程放置在每个核心上的方式和时间是徒劳的。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

默认情况下,您创建的所有线程都是 eligable ,可在所有CPU的所有核心上执行。但是,由于您的线程不是计算机中的唯一线程,因此这些核心在线程上无法100%可用。因此,调度程序将为您的线程提供相当可用的CPU功率。

由于您的线程可以在任何地方运行,因此当您的线程等待另一个核心变为可用时,您将永远不会遇到核心无效的情况。如果你在4核机器上有4个可运行的线程,那意味着所有内核都将忙碌。 注意:线程并不总是可运行的,例如如果等待I / O