我有一个用.net 4编写的Windows服务,它使用Threads定期执行作业。 服务器有超过20个cpu核心。
我在Windows服务中创建了10个线程。是否可以为每个线程分配一个cpu核心?
答案 0 :(得分:7)
操作系统已经完全适合您。它不能保证每个线程永远保持在同一个核心上(并且几乎在所有情况下,也不需要),但它确实试图保持尽可能多的内核忙碌。这意味着尽可能为所有可用线程提供自己的核心。
答案 1 :(得分:6)
可以通过点击本机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根据相同的方式安排许多托管线程 操作系统线程,或移动不同的托管线程 操作系统线程。