Ich lasse meinen NT-Dienst auf einem Intel Core2-basierten Win2k3-Rechner laufen, auf dem ich alle logischen CPUs (alle Bits in der Prozessaffinität) durchlaufen muss. Dazu rufe ich GetProcessAffinityMask() auf, um die Systemaffinitätsmaske abzurufen, und schalte dann den Prozess nacheinander auf jeden Prozessor um:
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;
}
Bei jeder Iteration rufe ich Code von hier um die aktuelle APIC-ID des Prozessors abzurufen. Das Problem ist, dass für verschiedene Prozessoren manchmal identische APIC-IDs zurückgegeben werden. Nach der Dokumentation muss jeder Prozessor im System eine identische ID haben.
Ich habe versucht, dieses Problem zu beheben - ich habe überprüft, ob Windows tatsächlich die Affinität ändert:
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;
}
Es wird genau die Affinitätsmaske zurückgegeben, die ich erwarte, aber die APIC-IDs können für verschiedene Prozessoren immer noch dieselben sein.
Gibt es eine Erklärung für diese merkwürdige Situation?