Это возможно, нажав на системные системные вызовы Win32, в частности SetThreadAffinityMask .Вам нужно будет выполнить несколько DllImports:
[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
[DllImport("kernel32.dll")]
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);
, а затем использовать их внутри каждой порожденной нити (конечно, с другим параметром для маски):
// set affinity of current thread to the given cpuID
SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1 << (int)cpuID));
Предупреждение: прямойкорреляция между потоками .NET и потоками ОС не гарантируется, по крайней мере, в соответствии с этим: http://msdn.microsoft.com/en-us/library/74169f59.aspx
ThreadId операционной системы не имеет фиксированной связи с управляемым потоком, поскольку неуправляемый хост может контролироватьотношения между управляемыми и неуправляемыми потоками.В частности, сложный хост может использовать Fiber API для планирования многих управляемых потоков в одном потоке операционной системы или для перемещения управляемого потока между различными потоками операционной системы.