Per XP, un rapido google ha rivelato questo:
https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm Questo aiuta?
Se tutto ciò che vuoi fare è evitare la contesa, non è necessario conoscere la CPU corrente. Potresti semplicemente scegliere un mucchio a caso. Oppure potresti avere un heap per thread. Sebbene in questo modo si possa ottenere più o meno contesa, si eviterebbe il sovraccarico del polling della CPU corrente, che può essere significativo o meno. Dai un'occhiata anche a scalable_allocator di Intel Thread Building Block, che potrebbe aver già risolto il problema meglio di te.
Dall'output di 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)
Sfortunatamente, questo è specifico per Linux. Dubito che ci sia un modo portatile per farlo.
Oltre alla risposta di Antony Vennard e al codice sul sito citato, ecco il codice che funzionerà anche per Visual C++ x64 (nessun assemblatore inline):
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;
}
Un breve sguardo all'implementazione di GetCurrentProcessorNumber() su Win7 x64 mostra che usano un meccanismo diverso per ottenere il numero del processore, ma nei miei (pochi) test i risultati sono stati gli stessi per la mia funzione fatta in casa e quella ufficiale.