【问题标题】:Identify processor (core) is used by specific thread识别处理器(核心)被特定线程使用
【发布时间】:2011-03-22 23:16:01
【问题描述】:

我想知道是否可以用特定的thread-id 识别线程使用的物理处理器(内核)?

例如,我有一个多线程应用程序,它有两 (2) 个线程(例如 thread-id = 10thread-id = 20)。我在具有双核处理器(核心 1 和核心 2)的系统上运行应用程序。那么,如何通过thread-id = 20获取线程使用的核心数?

附: Windows 平台。

谢谢你,

丹尼斯。

【问题讨论】:

    标签: windows multithreading processor affinity


    【解决方案1】:

    除非您使用线程关联,否则线程不会分配给特定的内核。对于每个时间片,线程可以在不同的内核上执行。这意味着如果有一个函数可以获取线程的核心,那么当您获得返回值时,很有可能该线程已经在另一个核心上执行了。

    如果您使用线程关联,您可以查看 Windows 线程关联函数 (http://msdn.microsoft.com/en-us/library/ms684847%28v=VS.85%29.aspx)。

    【讨论】:

    • 感谢您的回复,帕特里克!所以出现了另一个问题——是否有可能知道一个特定线程在特定核心上运行了多少时间? (例如,某个线程 20% 的时间片在核心 1 上运行,80% 的时间片在核心 2 上运行)
    • 我不知道丹尼斯。您可以做的是将线程限制为特定的内核(这称为线程关联)。也许您可以将您的进程拆分为多个线程,其中每个线程都分配给一个核心。你能解释一下原来的问题是什么吗? (导致你原来的问题)也许你的问题可以用另一种方式解决。
    • 我的任务是创建两个函数: 1. 第一个函数返回特定线程 ID 的多核处理器使用总量。我已经使用性能计数器功能实现了该功能。 2. 第二个函数通过特定的线程 id 返回特定的核心使用情况。我不知道如何创建函数,似乎不可能。
    • 我也觉得这是不可能的。
    【解决方案2】:

    有称为 GetCurrentProcessorNumber(自 Server 2003 和 Vista 起可用)和 GetCurrentProcessorNumberEx(自 Server 2008 R2 和 Windows 7 起可用)的函数。

    另请参阅 this question's answers 了解更多相关选项和注意事项(包括 Windows XP - 主要是 this answer describing the use of cpuid instruction)。

    当然,调度程序可以随时更改核心编号,因此如果您需要确定,那么如果您在测量或执行一小段时间之前和之后检查核心编号,可能会有所帮助时间,如果核心编号仍然相同,那么您知道中间代码最有可能在哪个核心上执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 2013-01-11
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多