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

时间:2012-03-21 06:38:01

标签: c# .net multithreading windows-services

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

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

2 个答案:

答案 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根据相同的方式安排许多托管线程   操作系统线程,或移动不同的托管线程   操作系统线程。