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

dev*_*747 27 cpu c# threading

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

var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
Run Code Online (Sandbox Code Playgroud)

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

Blu*_*eft 20

您不能在 .Net 中保证两个Threads 在两个单独的核心上运行。事实上,你也不能保证一个Thread只会在一个核心上运行(!)

这是因为托管线程与操作系统线程不同——单个托管线程可能使用多个操作系统线程来支持它。在 C# 中,您只能直接处理托管Threads (至少,无需借助 p/invoke 来调用 WinAPI 线程函数,您永远不应该这样做)

然而,.Net 和 Windows 线程调度程序非常擅长他们的工作——当第二个内核完全空闲时,它们不会在一个内核上运行两个线程。因此,一般情况下,您无需担心。

  • @svick:实际上,**在 x86** 上,确实如此。但是,该标准明确指出您不能依赖此行为,因此将来可能会发生变化。事实上,在 .Net CLR 的其他版本(如 XBox 360)上*不*为真。 (2认同)

Fra*_*mas 17

不,操作系统和 CPU 将决定运行什么以及何时运行。在您展示的简单示例中,排除其他任务,是的,这些任务很可能在单独的内核上并行运行,但很少能保证会是这种情况。

您可以使用线程关联来尝试对给定线程的内核分配进行一些控制。

还要考虑调度优先级以根据哪些线程应该完全并行以及哪些可以等待来堆叠甲板。