Para XP, un rápido google como reveló esto:
https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm ¿Esto ayuda?
Si todo lo que quiere hacer es evitar la contención, no necesita conocer la CPU actual. Podrías elegir un montón al azar. O podría tener un montón por hilo. Aunque puede obtener más o menos contención de esa manera, evitará la sobrecarga de sondear la CPU actual, que puede ser significativa o no. Consulte también el scalable_allocator de Intel Thread Building Block, que puede haber resuelto ese problema mejor que usted.
De la salida de 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)
Desafortunadamente, esto es específico de Linux. Dudo que haya una forma portátil de hacer esto.
Además de la respuesta de Antony Vennard y el código en el sitio citado, aquí hay un código que también funcionará para Visual C++ x64 (sin ensamblador en línea):
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;
}
Una breve mirada a la implementación de GetCurrentProcessorNumber() en Win7 x64 muestra que usan un mecanismo diferente para obtener el número de procesador, pero en mis (pocas) pruebas, los resultados fueron los mismos para mi función casera y oficial.