如何在多线程系统中的CORES之间分配线程。 假设我有一个创建6个线程的程序。我的系统有3个CORES。在这种情况下,线程是在3个CORE之间分配还是所有线程都在同一个CORE上执行?
答案 0 :(得分:2)
我在blog post找到了一个不错的解释。您可以使用一些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()
来规避这一点。