3

我有 2 个线程。我想告诉他们其中一个在第一个 cpu 上运行,第二个在第二个 cpu 上运行,例如在具有两个 cpu 的机器上。我怎样才能做到这一点?

这是我的代码

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

并且肯定该类UCI有一个名为main. 例如,我想在第一个处理器中设置这个线程

4

3 回答 3

5

我不建议这样做,但如果您真的需要:可以通过利用本机 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
于 2012-09-14T17:07:18.287 回答
2

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

如果一个核心非常繁忙,而另一个则不是。然后一个线程将缺乏处理能力,而另一个核心根本不会被加载。

于 2012-09-14T15:17:13.923 回答
2

在 .NET 上,您有ProcessThread.ProcessorAffinityProcessThread.IdealProcessor

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

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

于 2012-09-14T15:14:28.247 回答