我正在编写一个自定义任务调度程序,我想知道是否有任何方法可以在Mono上设置当前线程的处理器关联(在Linux上运行)。
对于在Windows上运行的.NET运行时,我已经设法通过遵循Lenard Gunda的Running .NET threads on selected processor cores文章来实现这一点;但是,他的方法在Mono(和Linux)上失败了,因为:
GetCurrentThreadId
库中的Kernel32.dll
进行P / Invoke调用。Process.Threads
属性当前在Mono上返回一个空集合。有没有人请为此解决?
答案 0 :(得分:2)
请注意,您无法控制任务何时运行,这取决于内核。 无论如何,在Linux上你需要P / Invoke到sched_setaffinity()来将一个线程绑定到一个特定的cpu。
请参阅man sched_setaffinity了解界面。
答案 1 :(得分:2)
lupus的回答是在正确的轨道上,但我需要进一步研究才能实现这一点(例如P/Invoke signature for sched_setaffinity
和resolution of 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's answer(根据我的其他问题)进行建议更正。