C# 在Mono(Linux)上为当前线程设置处理器关联
我正在编写一个自定义任务调度器,我想知道是否有任何方法可以在Mono(Linux上运行)上为当前线程设置处理器关联性 对于在Windows上运行的.NET运行时,我已经通过遵循Lenard Gunda的文章来实现这一点;然而,他的方法在Mono(和Linux)上失败了,因为:C# 在Mono(Linux)上为当前线程设置处理器关联,c#,linux,mono,affinity,C#,Linux,Mono,Affinity,我正在编写一个自定义任务调度器,我想知道是否有任何方法可以在Mono(Linux上运行)上为当前线程设置处理器关联性 对于在Windows上运行的.NET运行时,我已经通过遵循Lenard Gunda的文章来实现这一点;然而,他的方法在Mono(和Linux)上失败了,因为: 它需要对Kernel32.dll库中的GetCurrentThreadId进行P/Invoke调用 该属性当前在Mono上返回一个空集合 有人对此有解决办法吗?请注意,您实际上无法控制任务何时运行,这取决于内核。 无论如何
Kernel32.dll
库中的GetCurrentThreadId
进行P/Invoke调用有人对此有解决办法吗?请注意,您实际上无法控制任务何时运行,这取决于内核。 无论如何,在Linux上,您需要P/Invoke到sched_setaffinity()以将线程绑定到特定的cpu 有关接口,请参见man sched_setaffinity。的回答是正确的,但我花了一些进一步的研究来实现它(例如和)。以下是工作代码(不包括错误处理),以防任何人需要它:
[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);
}
[DllImport(“libc.so.6”,SetLastError=true)]
私有静态外部int sched_setaffinity(int pid,IntPtr cpusetsize,
参考ulong cpuset);
私有静态void SetAffinity(int processorID)
{
ulong处理器任务=1UL