我有一臺超過31個cpu內核的電腦。我想爲31號以後的cpu核心分配一個進程。我的問題是IntPtr在這臺機器上解析爲32位整數。它是一個運行64位操作系統的64位機器。這似乎違背什麼是微軟hereC#IntPtr和ProcessorAffinity - 如何超過32位?
的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掩碼的IntPtr(32位)0000000000000000000000000001
如果我傳入「31」,它將會返回E打開千萬00000000 00000000 00000000
我的願望是,它強制轉換爲64位,例如,如果我通過在值「32」,則回覆:00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000
有一種解決這個問題的方法?它固執地停留在32位。
你試圖通過這樣做解決什麼問題? –
這是底層winapi函數SetProcessAffinityMask()中的一個限制。在32位模式下,它只能處理32個處理器。如果你不能碰到AnyCPU,你可以做什麼,你的硬件比你的軟件強大得多。 –