如何找到运行线程的处理器编号?

时间:2010-02-06 22:55:06

标签: c linux memory-management pthreads windows-xp

我有一个内存堆管理器,它根据系统上的处理器数量将堆分成不同的段。内存只能分配给当前运行的线程处理器的分区。这将有助于不同的处理器继续运行,即使两个不同的处理器想要同时分配内存,至少我相信。

我找到了适用于Windows的函数GetCurrentProcessorNumber(),但这仅适用于Windows Vista及更高版本。有没有一种适用于Windows XP的方法?

另外,这可以通过POSIX系统上的pthread来完成吗?

5 个答案:

答案 0 :(得分:9)

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的。我怀疑有一种可移植的方式来做到这一点。

答案 1 :(得分:8)

对于XP,快速谷歌透露:https://www.cs.tcd.ie/Jeremy.Jones/GetCurrentProcessorNumberXP.htm这有帮助吗?

答案 2 :(得分:3)

除了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()的实现,表明它们使用不同的机制来获取处理器编号,但在我的(少数)测试中,我的家庭酿造和官方功能的结果相同

答案 3 :(得分:1)

如果您只想避免争用,则无需了解当前的CPU。你可以随便挑一个堆。或者你可以每个线程有一堆。虽然您可能会以这种方式获得或多或少的争用,但您可以避免轮询当前CPU的开销,这可能会也可能不会很重要。还可以查看英特尔螺纹构建模块的scalable_allocator,它可能已经比你更好地解决了这个问题。

答案 4 :(得分:0)

这个设计对我来说闻起来很糟糕。您似乎假设线程将与特定CPU保持关联。这不能保证。是的,一个线程通常可以保留在单个CPU上,但它不必,最终你的程序将有一个切换CPU的线程。它可能不会经常发生,但最终会发生。如果你的设计没有考虑到这一点,那么你很可能最终会遇到某种难以追踪的错误。

让我问一下这个问题,如果内存在一个CPU上分配并在另一个CPU上释放会发生什么?你的堆将如何处理?