Pour XP, un petit coup de google me révèle ceci :
https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm Est-ce que cela aide ?
Si tout ce que vous voulez faire est d'éviter les conflits, vous n'avez pas besoin de connaître le processeur actuel. Vous pouvez simplement choisir un tas au hasard. Ou vous pourriez avoir un tas par thread. Bien que vous puissiez obtenir plus ou moins de conflits de cette façon, vous éviterez la surcharge d'interrogation du processeur actuel, qui peut être significative ou non. Consultez également le scalable_allocator d'Intel Thread Building Block, qui a peut-être déjà résolu ce problème mieux que vous.
À partir de la sortie 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)
Malheureusement, ceci est spécifique à Linux. Je doute qu'il existe un moyen portable de le faire.
En plus de la réponse d'Antony Vennard et du code sur le site cité, voici un code qui fonctionnera également pour Visual C++ x64 (pas d'assembleur en ligne) :
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 bref aperçu de l'implémentation de GetCurrentProcessorNumber() sur Win7 x64 montre qu'ils utilisent un mécanisme différent pour obtenir le numéro de processeur, mais dans mes (quelques) tests, les résultats étaient les mêmes pour mon brassage maison et la fonction officielle.