Я запускаю свою службу NT на компьютере с процессором Intel Core2 Win2k3, где мне нужно перебирать все логические процессоры (все биты в соответствии процессов). Для этого я вызываю GetProcessAffinityMask (), чтобы получить маску соответствия системы, а затем по очереди переключить процесс на каждый процессор:
DWORD systemMask;
GetProcessAffinityMask( ... &systemMask );
DWORD processorId = 1;
while( systemMask != 0 ) {
SetProcessAffinityMask(... processorId );
Sleep( 1 ); // to be sure that it shifts to that processor
systemMask >>= 1;
processorId <<= 1;
}
На каждой итерации я вызываю код отсюда , чтобы получить текущий идентификатор APIC процессора. Проблема в том, что для разных процессоров он иногда возвращает идентичные идентификаторы APIC. Согласно документации каждый процессор в системе должен иметь идентичный идентификатор.
Я попытался отладить это - проверил, действительно ли Windows изменяет сходство:
while( systemMask != 0 ) {
SetProcessAffinityMask(... processorId );
Sleep( 1 ); // to be sure that it shifts to that processor
DWORD tempAffinity;
GetProcessAffinityMask( ... &tempAffinity );
// run APIC id detection code here
systemMask >>= 1;
processorId <<= 1;
}
Он возвращает именно ту маску сродства, которую я ожидаю, но идентификаторы APIC могут быть одинаковыми для разных процессоров.
Есть ли объяснение этой странной ситуации?