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

Posted

技术标签:

【中文标题】线程是如何在 Windows 上的多个处理器上执行的?【英文标题】:How are threads executed on multiple processors on Windows? 【发布时间】:2009-07-10 12:06:23 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于线程是如何在 Windows 上的多个处理器上执行的?的主要内容,如果未能解决你的问题,请参考以下文章

多线程基础知识总结

进程与线程

java 一个线程处理多个任务

如何在 Windows 上的多个进程上存储持久设置

c#基础并行Linq

Go语言并发编程简单入门