У меня есть компьютер с более чем 31 процессорным ядром. Я хотел бы назначить процесс ядрам процессора за пределами 31-го. Моя проблема в том, что IntPtr разрешает 32-битное целое на этом компьютере. Это 64-разрядная машина с 64-разрядной операционной системой. Это, кажется, бросает вызов тому, что заявлено Microsoft 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;
}
И продолжить пример, вот как я установил ProcessorAffinity:
using System.Diagnostics;
...
// set which processor to run the process on
process.ProcessorAffinity = GetCpuBinaryValue(coreIndex);
...
Например, я могу передать в значение «0», и оно вернет IntPtr (32-бит) с маской 00000000 00000000 00000000 00000001
Если я перейду в «31», это будет r eturn 10000000 00000000 00000000 00000000
Что я хочу это для того, чтобы бросить, как 64 бит, например, если я прохожу в значение "32", он будет возвращать: 00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000
Есть способ обойти эту проблему? Он упрямо застрял на 32-битной.
Какую проблему вы пытаетесь решить, выполнив это? –
Это ограничение в базовой функции winapi, SetProcessAffinityMask(). В 32-битном режиме он может обрабатывать только 32 процессора. Вы ничего не можете с этим поделать, если вы не можете столкнуться с AnyCPU, ваше оборудование значительно мощнее вашего программного обеспечения. –