在 C# 中为线程指定特殊 CPU



我有 2 个线程。我想告诉其中一个在第一个 CPU 上运行,第二个在第二个 CPU 上运行,例如在具有两个 CPU 的机器中。我该怎么做?

这是我的代码

UCI UCIMain = new UCI();
Thread UCIThread = new Thread(new ThreadStart(UCIMain.main));
UCIThread.Priority = ThreadPriority.BelowNormal;
UCIThread.Start();

可以肯定的是,类UCI有一个名为 main 的成员函数。我想在第一个处理器中设置这个线程,例如

我不建议这样做,但如果你真的需要:可以通过利用本机 Win32 系统调用,特别是SetThreadAffinityMask.您需要执行一些DllImport

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

然后在每个生成的线程中使用它们(当然,掩码使用不同的参数):

// set affinity of current thread to the given cpuID
SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1)); // CPU 0

在 .NET 上,您有 ProcessThread.ProcessorAffinity 和 ProcessThread.IdealProcessor

但是由于您谈论的是Thread而不是Process,我相信在 .NET 中没有直接可用的方法来执行此操作。

Thread.SetProcessorAffinity(),但它仅适用于Xbox上的XNA。

不要这样做。操作系统任务调度程序比手动调整聪明得多。从技术上讲,您可以使用线程相关性,但这通常不是一个好主意。请改用线程池或 TPL 库。

如果一个核心超级忙,而另一个核心不是。然后,一个线程将缺乏处理能力,而另一个内核将根本不加载。

最新更新