多核处理器上的多个线程

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

我在这篇博客文章中找到了一个不错的解释。 您可以使用一些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针对同一操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程。

但是,您可以通过在执行pinvoke调用之前调用Thread.BeginThreadAffinity()来避免这种情况。