设置ProcessorAffinity和TPL

如果我为我的进程设置处理器亲和力,如下所示:

var me = Process.GetCurrentProcess(); me.ProcessorAffinity = (IntPtr) processorAffinityMask; 

……,第三方物流公司是否会尊重其所有工作? 也就是说,是否有任何使用默认调度程序的工具将工作推送到我给定掩码不允许的处理器? 有没有可以certificate这一点的测试?

是的,TPL将遵守您指定的亲和力掩码。

无法兑现它的唯一方法是明确地去改变亲和力,但它并没有这样做。

虽然创建一个可以在TPL中运行每个可能的代码路径的测试是非常不可行的,但您当然可以设置一个可以从许多可用内核中受益的测试,将关联掩码设置为1个CPU,并通过任务管理器观察该亲和力永远不会改变,CPU利用率永远不会超过1 / N,其中N是存在的核心数。

您还可以将该测试扩展为具有M个核心的亲和性,并观察CPU利用率<= M / N. 您还可以直接观察到任务管理器中的关联性不会更改。

一个合适的测试是每次迭代需要大量时间并提供许多独立工作单元的测试,例如计算N为大的第一个素数> N,并在目标质数数组上使用Parallel.Foreach。 arrays大小应显着大于存在的核心数。

另一方面,显式设置CPU亲和性很少是个好主意。 好奇你的用例是什么。