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

ehs*_*san 6 .net c# multithreading windows-services

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

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

jal*_*alf 7

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


Tud*_*dor 6

通过访问本机Win32系统调用,特别是SetThreadAffinityMask,可以实现.你需要做一些DllImports:

[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentThread();
[DllImport("kernel32.dll")]
static extern IntPtr SetThreadAffinityMask(IntPtr hThread, IntPtr dwThreadAffinityMask);
Run Code Online (Sandbox Code Playgroud)

然后在每个衍生的线程中使用它们(当然,使用不同的掩码参数):

// set affinity of current thread to the given cpuID
SetThreadAffinityMask(GetCurrentThread(), new IntPtr(1 << (int)cpuID));
Run Code Online (Sandbox Code Playgroud)

警告:不保证.NET线程和OS线程之间的直接关联,至少根据这个:http://msdn.microsoft.com/en-us/library/74169f59.aspx

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

  • 即便如此,我最后的评论意味着在理论上这是可能的预防措施,我认为它应该留在那里.操作系统可以自由地试验我发布的代码并亲自查看. (4认同)