Für XP ergab eine schnelle Google-Suche Folgendes:
https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm Hilft das?
Wenn Sie lediglich Konflikte vermeiden möchten, müssen Sie die aktuelle CPU nicht kennen. Sie könnten einfach zufällig einen Haufen auswählen. Oder Sie könnten einen Haufen pro Thread haben. Obwohl Sie auf diese Weise mehr oder weniger Konflikte bekommen können, würden Sie den Overhead des Abfragens der aktuellen CPU vermeiden, der erheblich sein kann oder auch nicht. Sehen Sie sich auch den Scalable_allocator des Intel Thread Building Blocks an, der dieses Problem möglicherweise bereits besser gelöst hat, als Sie es wollen.
Aus der Ausgabe von man sched_getcpu
:
NAME
sched_getcpu - determine CPU on which the calling thread is running
SYNOPSIS
#define _GNU_SOURCE
#include <utmpx.h>
int sched_getcpu(void);
DESCRIPTION
sched_getcpu() returns the number of the CPU
on which the calling thread is currently executing.
RETURN VALUE
On success, sched_getcpu() returns a non-negative CPU number.
On error, -1 is returned and errno is set to indicate the error.
SEE ALSO
getcpu(2)
Leider ist dies Linux-spezifisch. Ich bezweifle, dass es dafür einen portablen Weg gibt.
Zusätzlich zu Antony Vennards Antwort und dem Code auf der zitierten Seite ist hier Code, der auch für Visual C++ x64 funktioniert (kein Inline-Assembler):
DWORD GetCurrentProcessorNumberXP() {
int CPUInfo[4];
__cpuid(CPUInfo, 1);
// CPUInfo[1] is EBX, bits 24-31 are APIC ID
if ((CPUInfo[3] & (1 << 9)) == 0) return -1; // no APIC on chip
return (unsigned)CPUInfo[1] >> 24;
}
Ein kurzer Blick auf die Implementierung von GetCurrentProcessorNumber() auf Win7 x64 zeigt, dass sie einen anderen Mechanismus verwenden, um die Prozessornummer zu erhalten, aber in meinen (wenigen) Tests waren die Ergebnisse für meine selbstgebaute und die offizielle Funktion gleich. P>