fork download
  1. using System;
  2. using System.Threading;
  3. using System.Runtime.InteropServices;
  4.  
  5. static class Program
  6. {
  7. [DllImport("libc.so.6")]
  8. private static extern int sched_getcpu();
  9.  
  10. [DllImport("libc.so.6", SetLastError = true)]
  11. private static extern int sched_setaffinity(int pid, IntPtr cpusetsize, ulong[] cpuset);
  12.  
  13. private static void SetAffinity(int processorID)
  14. {
  15. ulong processorMask = 1UL << processorID;
  16. sched_setaffinity(0, new IntPtr(sizeof(ulong)), new[] { processorMask });
  17. }
  18.  
  19. static void Main(string[] args)
  20. {
  21. int processorCount = Environment.ProcessorCount;
  22. Console.WriteLine("Processor count: " + processorCount);
  23. Random random = new Random();
  24. Thread[] threads = new Thread[100];
  25.  
  26. for (int i = 0; i < 100; i++)
  27. {
  28. int target = random.Next(0, processorCount);
  29.  
  30. threads[i] = new Thread(new ThreadStart(() =>
  31. {
  32. Thread.BeginThreadAffinity();
  33. try
  34. {
  35. SetAffinity(target);
  36. int actual = sched_getcpu();
  37. if (actual == target)
  38. Console.WriteLine("* Running correctly on " + actual);
  39. else
  40. Console.WriteLine("* Running on " + actual + "; should be on " + target);
  41. }
  42. finally
  43. {
  44. Thread.EndThreadAffinity();
  45. }
  46. }));
  47.  
  48. threads[i].Start();
  49. }
  50.  
  51. for (int i = 0; i < 100; i++)
  52. threads[i].Join();
  53. }
  54. }
  55.  
Success #stdin #stdout 0.05s 45440KB
stdin
1
2
10
42
11
stdout
Processor count: 4
* Running correctly on 2
* Running correctly on 2
* Running correctly on 2
* Running correctly on 1
* Running correctly on 0
* Running correctly on 2
* Running correctly on 3
* Running correctly on 1
* Running correctly on 1
* Running correctly on 3
* Running correctly on 1
* Running correctly on 3
* Running correctly on 0
* Running correctly on 1
* Running correctly on 0
* Running correctly on 2
* Running correctly on 2
* Running correctly on 0
* Running correctly on 0
* Running correctly on 2
* Running correctly on 2
* Running correctly on 3
* Running correctly on 1
* Running correctly on 2
* Running correctly on 1
* Running correctly on 2
* Running correctly on 2
* Running correctly on 3
* Running correctly on 0
* Running correctly on 2
* Running correctly on 0
* Running correctly on 3
* Running correctly on 0
* Running correctly on 2
* Running correctly on 3
* Running correctly on 1
* Running correctly on 1
* Running correctly on 2
* Running correctly on 2
* Running correctly on 0
* Running correctly on 1
* Running correctly on 0
* Running correctly on 2
* Running correctly on 3
* Running correctly on 2
* Running correctly on 0
* Running correctly on 2
* Running correctly on 1
* Running correctly on 3
* Running correctly on 0
* Running correctly on 0
* Running correctly on 2
* Running correctly on 3
* Running correctly on 3
* Running correctly on 2
* Running correctly on 3
* Running correctly on 1
* Running correctly on 0
* Running correctly on 1
* Running correctly on 0
* Running correctly on 0
* Running correctly on 0
* Running correctly on 2
* Running correctly on 1
* Running correctly on 1
* Running correctly on 1
* Running correctly on 1
* Running correctly on 1
* Running correctly on 2
* Running correctly on 3
* Running correctly on 3
* Running correctly on 1
* Running correctly on 0
* Running correctly on 0
* Running correctly on 2
* Running correctly on 0
* Running correctly on 0
* Running correctly on 2
* Running correctly on 3
* Running correctly on 1
* Running correctly on 1
* Running correctly on 2
* Running correctly on 1
* Running correctly on 3
* Running correctly on 2
* Running correctly on 3
* Running correctly on 0
* Running correctly on 2
* Running correctly on 0
* Running correctly on 1
* Running correctly on 0
* Running correctly on 0
* Running correctly on 3
* Running correctly on 2
* Running correctly on 0
* Running correctly on 0
* Running correctly on 3
* Running correctly on 1
* Running correctly on 0
* Running correctly on 1