【问题标题】:Processor Affinity and Thread Creation by Thread Pool线程池的处理器亲和性和线程创建
【发布时间】:2016-12-13 23:56:13
【问题描述】:

此问题基于 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 绑定函数,它只执行一些 CPU 绑定计算,大约需要 100 毫秒。当我计算创建的线程数大约为 5 时。但根据我的理解,由于 CPU 亲和性设置为仅使用 1 个处理器,线程池不应创建超过 1 个线程。任何想法?在 Jeffrey 的演示文稿中,它显示它只为整个 200 个工作项创建了 1 个线程,但是当我在我的 PC 上运行相同的示例时,我可以看到创建了 5 个线程。 (我的电脑有 2 个核心)

【问题讨论】:

  • 在降级到 .NET 3.5 之后,ThreadPool 开始考虑 Process.ProcessorAffinity 的值

标签: c# multithreading task


【解决方案1】:

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

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

【讨论】:

  • 也许你想把你从哪里得到的链接放在上面,以防 OP 想去那个链接阅读更多内容。
  • 不确定我是否从 cmets 那里得到了清晰的了解。如果我将处理器亲和性设置为仅使用 1 个 CPU,并且我将 200 个工作项排入队列,每个工作项大约需要 100 毫秒到线程池,我认为线程池不应该创建多个线程。但是我看到创建了 5 个线程,尽管我的 PC 中只有 4 个逻辑 CPU。 (这不是我的理解)。重要的是我所有的工作项都是 CPU 绑定任务并且没有 IO 等待..
  • @DevMonk(派对有点晚了)AFAIK这是为了防止饥饿,其中一些任务会阻止其他任务运行。如果要严格控制,全局线程池就不合适了。
猜你喜欢
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2014-08-30
  • 2011-01-15
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多