此问题基于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个核心)
答案 0 :(得分:0)
默认值是每个处理器一个线程池,但该线程池中的线程数由.Net计算。以下摘自MSDN https://msdn.microsoft.com/en-us/library/system.threading.threadpool(v=vs.110).aspx:
每个进程有一个线程池。从.NET Framework 4开始,进程的线程池的默认大小取决于多个因素,例如虚拟地址空间的大小。进程可以调用GetMaxThreads方法来确定线程数。可以使用SetMaxThreads方法更改线程池中的线程数。每个线程使用默认堆栈大小并以默认优先级运行。