当您在多核处理器上启动多个线程时,是否保证它们由不同的核心处理?

当您在多核处理器上启动多个线程时,是否保证它们由不同的核心处理?

我有一个 Pentium core i5 处理器,它有 4 个核心。如果我在 C# 控制台程序中执行此操作

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();

t1 和 t2 线程是否保证在不同的内核上运行?

答案1

在 .Net 中,你无法保证两个Thread程序在两个不同的核心上运行。事实上,您也不能保证一个Thread只在一个核心上运行(!)

这是因为托管线程与 OS 线程不同- 单个托管线程可能使用多个 OS 线程来支持它。在 C# 中,您只能直接处理托管Thread线程(至少,不需要借助 p/invoke 来调用 WinAPI 线程函数,这是你永远不应该做的)

但是,.Net 和 Windows 线程调度程序非常擅长处理它们的工作 - 它们不会在单个核心上运行两个线程,而第二个核心完全处于空闲状态。所以,一般来说,你不必担心这一点。

答案2

不,操作系统和 CPU 将决定何时运行什么。在您所展示的简单示例中,除了其他任务之外,这些任务很可能会在不同的核心上并行运行,但很少能保证情况确实如此。

您可以使用线程亲和性尝试对给定线程的核心分配进行一些控制。

还请考虑调度优先级确定哪些线程应该完全并行,哪些线程可以等待。

相关内容