XP の場合、これを明らかにした簡単なグーグル:
https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm これは役に立ちますか?
競合を避けたいだけなら、現在の CPU を知る必要はありません。ヒープをランダムに選択できます。または、スレッドごとにヒープを持つこともできます。そのようにして多かれ少なかれ競合が発生する可能性がありますが、現在の CPU をポーリングするオーバーヘッドを回避できます。これは、重要である場合とそうでない場合があります。また、インテル スレッド ビルディング ブロックのスケーラブルなアロケーターもチェックしてください。これは、この問題をあなたよりもうまく解決しているかもしれません。
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)
残念ながら、これは Linux 固有のものです。これを行う移植可能な方法があるとは思えません。
Antony Vennard の回答と引用されたサイトのコードに加えて、Visual C++ x64 でも機能するコードを次に示します (インライン アセンブラーなし):
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;
}
Win7 x64 での GetCurrentProcessorNumber() の実装を簡単に見てみると、プロセッサ番号を取得するために異なるメカニズムが使用されていることがわかりますが、私の (少数の) テストでは、自作の関数と公式の関数の結果は同じでした。