为每个线程分配一个cpu核心

我有一个用.net 4编写的Windows服务,它使用Threads定期做作业。 服务器有超过20个CPU核心。

我在我的Windows服务中创建10个线程。 是否可以为每个线程分配一个cpu核心?

操作系统已经完全适合您。 它并不能保证每个线程永远保持在同一个内核上(并且几乎在所有情况下都不需要),但它确实尽可能地保持尽可能多的内核。 这意味着尽可能地为所有可用线程提供自己的核心。

通过访问本机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线程和OS线程之间的直接关联,至少根据这一点: http : //msdn.microsoft.com/en-us/library/74169f59.aspx

操作系统ThreadId与托管线程没有固定关系,因为非托管主机可以控制托管和非托管线程之间的关系。 具体而言,复杂的主机可以使用Fiber API针对同一操作系统线程调度许多托管线程,或者在不同的操作系统线程之间移动托管线程。