2

在多线程系统中,线程是如何在核心之间分布的。假设我有一个创建 6 个线程的程序。我的系统有 3 个核心。在这种情况下,线程将分布在 3 个 CORE 之间,还是所有线程都在同一个 CORE 上执行?

4

1 回答 1

2

我在这篇博文中找到了一个不错的解释。您可以使用一些 pinvoke 调用来设置线程关联:

[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
[DllImport("kernel32.dll")]
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);

然后你可以像这样使用它:

SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1 << processorNumber));

但是你必须知道,托管线程可以从一个非托管线程切换到另一个,并且上面的方法适用于非托管线程,因此不能保证它会 100% 工作。来自Thread类的 MSDN 文档:

操作系统 ThreadId 与托管线程没有固定关系,因为非托管主机可以控制托管线程和非托管线程之间的关系。具体来说,复杂的主机可以使用 CLR Hosting API 针对同一操作系统线程调度许多托管线程,或在不同操作系统线程之间移动托管线程。

Thread.BeginThreadAffinity()但是,您可以通过在执行 pinvoke调用之前调用来规避这一点。

于 2012-12-09T10:22:05.923 回答