处理器关联性和线程池创建线程

时间:2016-12-13 23:56:13

标签: c# multithreading task

此问题基于Jeffrey Richter在Microsoft Virtual Academy中的线程类。

根据我的理解,如果我将处理器亲和性设置为仅使用1个处理器,如下所示

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

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

ActiveWorker()是一个CPU绑定函数,它只执行一些大约需要100ms的CPU绑定计算。当我计算创建的线程数大约为5.但是根据我的理解,因为CPU亲和性被设置为仅使用1个处理器,所以线程池不应该创建多于1个线程。任何的想法?在Jeffrey的演示中,它显示它只为整个200个工作项创建了1个线程,但是当我在PC中运行相同的样本时,我可以看到创建了5个线程。 (我的电脑有2个核心)

1 个答案:

答案 0 :(得分:0)

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

  

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