在Mono(Linux)上为当前线程设置处理器关联

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

对于在Windows上运行的.NET运行时,我设法通过在选定的处理器内核文章上遵循Lenard Gunda的运行.NET线程来工作; 然而,他的方法在Mono(和Linux)上失败,因为:

  1. 它需要对Kernel32.dll库中的GetCurrentThreadId进行P / Invoke调用。
  2. 当前Process.Threads属性返回Mono上的一个空集合。

有没有人请为此有一个解决方法?

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

请参阅man sched_setaffinity接口。

狼疮的答案是在正确的轨道上,但是我花了一些进一步的研究来实现它(例如sched_setaffinity的P / Invoke签名和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); } 

编辑 :上面的签名工作正常我的实验,但提到大卫Heffernan的答案 (在我的另一个问题)建议的更正。