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

本文关键字:线程 前线 设置 处理器 关联 Mono Linux | 更新日期: 2023-09-27 18:06:15

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

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

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

有没有人可以解决这个问题?

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

lupus的答案是正确的,但是我花了一些进一步的研究来实现这个(例如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);
}

编辑:上面的签名在我的实验中工作得很好,但请参考David Heffernan的回答(在我的另一个问题下)以获得建议的更正。

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

参见man sched_setaffity查看接口