3

我正在编写一个自定义任务调度程序,我想知道是否有任何方法可以为 Mono(在 Linux 上运行)上的当前线程设置处理器亲和性。

对于在 Windows 上运行的 .NET 运行时,我已经通过遵循 Lenard Gunda 的Running .NET threads on selected processor cores文章设法让它工作;然而,他的方法在 Mono(和 Linux)上失败了,因为:

  1. 它需要GetCurrentThreadIdKernel32.dll库中调用 P/Invoke。
  2. Process.Threads属性当前在 Mono 上返回一个空集合。

有人请有解决方法吗?

4

2 回答 2

3

lupus的答案是在正确的轨道上,但我花了一些进一步的研究来实现它(例如P/Invoke 签名sched_setaffinity解决方案libc.so.6)。如果有人需要,这是工作代码(不包括错误处理):

[DllImport("libc.so.6", SetLastError=true)]
private static extern int sched_setaffinity(int pid, IntPtr cpusetsize, 
                                            ref ulong cpuset);

private static void SetAffinity(int processorID)
{
    ulong processorMask = 1UL << processorID;
    sched_setaffinity(0, new IntPtr(sizeof(ulong)), ref processorMask);
}

编辑:上述签名对我的实验效果很好,但请参阅David Heffernan 的回答(在我的另一个问题下)以获得建议的更正。

于 2013-06-15T14:00:56.107 回答
2

请注意,您无法真正控制任务何时运行,这取决于内核。无论如何,在 Linux 上,您需要 P/Invoke 到 sched_setaffinity() 以将线程绑定到特定的 cpu。

有关接口,请参见 man sched_setaffinity。

于 2013-03-29T08:22:07.333 回答