C# 在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上返回一个空集合 有人对此有解决办法吗?请注意,您实际上无法控制任务何时运行,这取决于内核。 无论如何

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

对于在Windows上运行的.NET运行时,我已经通过遵循Lenard Gunda的文章来实现这一点;然而,他的方法在Mono(和Linux)上失败了,因为:

  • 它需要对
    Kernel32.dll
    库中的
    GetCurrentThreadId
    进行P/Invoke调用
  • 该属性当前在Mono上返回一个空集合

  • 有人对此有解决办法吗?

    请注意,您实际上无法控制任务何时运行,这取决于内核。 无论如何,在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