在Mono (Linux)上为当前线程设置处理器关联
本文关键字:线程 前线 设置 处理器 关联 Mono Linux | 更新日期: 2023-09-27 18:06:15
我正在编写一个自定义任务调度程序,我想知道是否有任何方法可以在Mono(在Linux上运行)上设置当前线程的处理器亲和性。
对于在Windows上运行的。net运行时,我通过遵循Lenard Gunda在选定处理器内核上运行。net线程的文章,设法使其工作;然而,他的方法在Mono(和Linux)上失败了,因为:
- 需要P/Invoke调用
Kernel32.dll
库中的GetCurrentThreadId
。 -
Process.Threads
属性当前在Mono上返回一个空集合。
有没有人可以解决这个问题?
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查看接口