在C#中为线程指定一个特殊的cpu

时间:2012-09-14 15:10:47

标签: c# multithreading 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的成员函数。我想在第一个处理器中设置此线程,例如

3 个答案:

答案 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.ProcessorAffinityProcessThread.IdealProcessor

但是既然你在讨论Thread而不是Process,我相信在.NET中没有直接可用的方法。

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

答案 2 :(得分:2)

不要这样做。 OS任务调度程序比手动调整更聪明。你可以在技术上使用thread affinity,但这通常不是一个好主意。而是使用线程池或TPL库。

如果一个核心超级繁忙而另一个核心不繁忙。然后一个线程将挨饿以获得处理能力,而另一个核心将根本不会被加载。