在具有32个以上逻辑核心的系统上使用Process.ProcessorAffinity

时间:2011-06-03 14:38:32

标签: c# .net

我正在尝试在具有16个物理处理器核心,32个逻辑的计算机上的进程上设置处理器关联。以前,我们使用的是int,但是当你有32个逻辑核时,它会溢出。

在设置处理器关联性时,使用long而不是int仍然有用吗?

请参阅下面的代码。

 try
 {
    string pathToExe = GetPathToExe( jobType );

    long processorAffinity = DetermineProcessorAffinity();

    Process jobProcess = Process.Start( pathToExe, jobId.ToString() );
    if ( jobProcess != null )
    {
       jobProcess.ProcessorAffinity = new IntPtr( processorAffinity );
    }

 }

2 个答案:

答案 0 :(得分:4)

引擎盖下ProcessorAffinity属性最终将调用Win32方法SetProcessAffinityMask

此方法适用于超过32个处理器,此解决方案应该可以使用。

请注意,这种方法在32位进程中不起作用。在32位进程中,IntPtr的后备值仍为32位。 IntPtr构造函数将静默地将long值截断为int值,并且您永远无法将额外处理器的亲和力设置为更多。

答案 1 :(得分:2)

来自IntPtr documentation

  

IntPtr类型设计为   大小为的整数   特定于平台的。那是一个   预计这种类型的实例   在32位硬件和32位是32位   操作系统和64位   64位硬件和操作系统。

换句话说:它应该适用于64位系统,但不适用于32位系统。我想这不是你的问题。