2016-12-13 68 views
3

此问题基于Microsoft Virtual Academy中的Jeffrey Richter线程类。通过线程池处理器相关性和线程创建

按我的理解,如果我把我的处理器亲和力只使用1个处理器如下图所示

Int32 affinity = 1; 
Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)affinity; 

for (int i = 0; i < 200 ; i++) 
{ 
    ThreadPool.QueueUserWorkItem(ActiveWorker); 
} 

ActiveWorker()是CPU绑定的功能,只是做了一些CPU密集型的计算是需要大约100毫秒。当我计算创建的线程数大约为5.但根据我的理解,因为CPU关联性设置为仅使用1个处理器,所以线程池不应创建超过1个线程。任何想法?在Jeffrey的演示中,它显示它只为整个200工作项目创建了1个线程,但是当我在PC中运行同一个样本时,可以看到创建了5个线程。 (我的电脑有2个内核)

+0

降级到.NET 3.5线程池后开始考虑Process.ProcessorAffinity – RUSH

回答

0

默认值为每个处理器一个线程池,但该线程池中的线程数由.Net计算。这里是摘自MSDN https://msdn.microsoft.com/en-us/library/system.threading.threadpool(v=vs.110).aspx

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

+4

的价值也许你想把你有哪里是在情况下,OP想去那个链接阅读更多的链接。 – CodingYoshi

+0

不知道我是否从评论中得到了清晰的理解。如果我把处理器亲和力只使用1个CPU,并且我排队了200个工作项目,每个工作项目都要花费100毫秒到线程池,我认为线程池不应该创建更多的线程。但是我看到5个线程创建了事件,尽管我的PC中只有4个逻辑CPU。 (这不是我的理解)。重要的是,我所有的工作项目都是CPU绑定任务,没有IO等待。 – DevMonk