Search code examples
c#linuxmonoaffinity

Set processor affinity for current thread on Mono (Linux)


I'm writing a custom task scheduler, and I would like to know if there is any way of setting the processor affinity for the current thread on Mono (running on Linux).

For the .NET runtime running on Windows, I've managed to get this to work by following Lenard Gunda's Running .NET threads on selected processor cores article; however, his approach fails on Mono (and Linux) because:

  1. It requires a P/Invoke call to GetCurrentThreadId in the Kernel32.dll library.
  2. The Process.Threads property currently returns an empty collection on Mono.

Does anyone please have a workaround for this?


Solution

  • lupus's answer was on the right track, but it took me some further research to get this implemented (such as the P/Invoke signature for sched_setaffinity and the resolution of libc.so.6). Here's the working code (excluding error-handling) in case anyone needs it:

    [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);
    }
    

    Edit: The above signature worked fine for my experiments, but refer to David Heffernan's answer (under my other question) for a suggested correction.