C# IntPtr 和 ProcessorAffinity - 如何超过 32 位

本文关键字:何超过 IntPtr ProcessorAffinity | 更新日期: 2023-09-27 18:31:25

我有一台超过 31 个 CPU 内核的计算机。我想为 31 日之后的 CPU 内核分配一个进程。我的问题是 IntPtr 在这台机器上解析为 32 位整数。它是一台运行 64 位操作系统的 64 位计算机。这似乎违背了Microsoft在这里所说的

IntPtr 类型设计为大小为 特定于平台。也就是说,此类型的实例应为 32 位硬件和操作系统上的 32 位,以及 64 位 64 位硬件和操作系统。

以下是我构建 Intptr 的方式:

public static IntPtr GetCpuBinaryValue(int cpuIndex)
{
    // The IntPtr type is designed to be an integer whose size is platform - specific.
    // That is, an instance of this type is expected to be 32 - bits on 32 - bit hardware and operating systems,
    // and 64 - bits on 64 - bit hardware and operating systems.

    IntPtr ptr = new IntPtr(Convert.ToInt64(Math.Pow(2, cpuIndex)));
    return ptr;
}

为了继续这个例子,以下是我如何设置处理器亲和力:

using System.Diagnostics;
...
    // set which processor to run the process on
                process.ProcessorAffinity = GetCpuBinaryValue(coreIndex);
...

例如,我可以传入值"0",它将返回一个掩码为

00000000 00000000 000000000 000000000 00000001

如果我传入"31",它将返回 10000000

00000000 000000000 000000000

我希望它转换为 64 位,例如,如果我传入值"32",它将返回:

000000000 000000000 000000000 00000001 000000000 00000000 00000000 00000000

有没有办法解决这个问题?它顽固地停留在 32 位上。

C# IntPtr 和 ProcessorAffinity - 如何超过 32 位

您可能正在运行x86Any CPUIntPtr特定于平台,但也取决于流程本身。如果进程在 64 位模式下运行,则指针将为 64 位,如果进程以 32 位运行,则指针将为 32 位。

如果切换到显式以x64身份运行(如如何:将项目配置为目标平台中所述),则溢出异常将消失,并且正确的值似乎存储在返回值中。

Old thread & OP 没有询问正在运行的进程的设置,但如果你碰巧从 PowerShell 中设置 ProcessorAffinity,你可以检查字节数:

[IntPtr]::Size

如果你在x86版本的Powershell上运行它,你会看到大小为4,你只能寻址32个内核。 运行 x64 版本的 Powershell,IntPtr 的大小将为 8 字节,您将能够设置相关性。