处理器亲和性和线程池中的线程创建

4
这个问题基于Jeffrey Richter在微软虚拟学院中的线程类。
据我理解,如果我像下面展示的那样将处理器亲和性设置为仅使用一个处理器:
Int32 affinity = 1;
Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)affinity;

for (int i = 0; i < 200 ; i++) 
{
     ThreadPool.QueueUserWorkItem(ActiveWorker);
}
ActiveWorker()是一个CPU绑定的函数,仅进行一些大约需要100毫秒的CPU密集型计算。当我计算创建的线程数量时,大约有5个线程。但根据我的理解,由于CPU亲和力设置为仅使用1个处理器,线程池不应该创建超过1个线程。您有什么想法吗?在Jeffrey的演示中,它仅显示为整个200个工作项创建了1个线程,但是当我在我的PC上运行相同的样本时,我可以看到创建了5个线程。(我的PC有2个内核)

降级到.NET 3.5后,线程池开始考虑Process.ProcessorAffinity的值。 - Ruslan Shupoval
1个回答

0

默认情况下,每个处理器都有一个线程池,但该线程池中的线程数量由 .Net 计算。以下是 MSDN 中的摘录 https://msdn.microsoft.com/zh-cn/library/system.threading.threadpool(v=vs.110).aspx

每个进程都有一个线程池。从 .NET Framework 4 开始,进程的线程池默认大小取决于多个因素,例如虚拟地址空间的大小。进程可以调用 GetMaxThreads 方法来确定线程数。使用 SetMaxThreads 方法可以更改线程池中的线程数。每个线程使用默认堆栈大小并以默认优先级运行。


4
或许你想在那里加上链接,以便原帖作者可以访问链接并阅读更多内容。 - CodingYoshi
不确定我是否从评论中得到了清晰的理解。如果我将处理器亲和性设置为仅使用1个CPU,并将大约需要100毫秒的200个工作项排队到线程池中,我认为线程池不应该创建超过一个线程。但是,我看到有5个线程被创建,尽管我的PC只有4个逻辑CPU。(这不是我的理解)。重要的是,所有我的工作项都是CPU绑定任务,没有IO等待。 - DevMonk
@DevMonk(有点晚了)据我所知,这是为了防止饥饿现象,即少数任务阻止其他任务运行。如果您想要严格控制,则全局线程池不适用。 - Dykam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接