我有2个帖子。我想告诉其中一个在第一个cpu上运行,第二个在第二个cpu上运行,例如在一个有两个cpu的机器上运行。我怎么能这样做?
这是我的代码
UCI UCIMain = new UCI();
Thread UCIThread = new Thread(new ThreadStart(UCIMain.main));
UCIThread.Priority = ThreadPriority.BelowNormal;
UCIThread.Start();
并确保类UCI
具有名为main
的成员函数。我想在第一个处理器中设置此线程,例如
答案 0 :(得分:4)
我不推荐这个,但是如果你真的需要:可以通过点击本机Win32系统调用,特别是SetThreadAffinityMask
。您需要执行一些DllImport
s:
[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
答案 1 :(得分:2)
在.NET上,您有ProcessThread.ProcessorAffinity和ProcessThread.IdealProcessor
但是既然你在讨论Thread
而不是Process
,我相信在.NET中没有直接可用的方法。
有Thread.SetProcessorAffinity()
,但它仅适用于Xbox上的XNA。
答案 2 :(得分:2)
不要这样做。 OS任务调度程序比手动调整更聪明。你可以在技术上使用thread affinity,但这通常不是一个好主意。而是使用线程池或TPL库。
如果一个核心超级繁忙而另一个核心不繁忙。然后一个线程将挨饿以获得处理能力,而另一个核心将根本不会被加载。